home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 09 / ami919.txt < prev    next >
Text File  |  1997-04-07  |  7KB  |  199 lines

  1. Jak ulepszyê procedurë? (odc. 11.)
  2. ---------------------------------
  3.  
  4. DETEKCJA I WYZNACZANIE KRAWËDZI 
  5.  
  6. <lead>Na pewno zetknëliôcie sië juû w programach do obróbki
  7. grafiki z takimi opcjami, jak: EMBOSS, RELIEF MAP, EDGE DETECT,
  8. czy LAPLACIAN. Nie wszyscy jednak wiecie, ûe efekty te (i to w
  9. czasie rzeczywistym) moûemy bez problemów wykonywaê w asemblerze.
  10. Daje to szansë wykorzystania ich w demie.
  11.  
  12. <a>Miklesz/Damage
  13.  
  14. <txt>Sekret szybkoôci polega tu na paru uproszczeniach, które
  15. choê uniemoûliwiajâ wykonanie na przeksztaîconym obrazie analizy
  16. iloôciowej (polegajâcej na wykryciu krawëdzi i odtwarzaniu
  17. wyodrëbnionych czâstek), to jednak pozwalajâ na osiâgniëcie
  18. bardzo dobrego efektu wizualnego.
  19.  
  20. Na poczâtek dawka teorii, która jest konieczna do zrozumienia
  21. idei detekcji krawëdzi.
  22.  
  23. <sr>Istota krawëdzi...
  24.  
  25. ****** tu koniecznie rysunek (rys. 1) *****************
  26.  
  27. <txt>Wbrew pozorom zdefiniowanie krawëdzi nie jest takie îatwe,
  28. poniewaû, jak sië juû za chwileczkë przekonacie, krawëdzie obrazu
  29. mogâ wystëpowaê (i najczëôciej wystëpujâ) pod bardzo róûnymi
  30. postaciami. Jakimi? Zazwyczaj krawëdú utoûsamiamy z przejôciem
  31. (zmianâ jasnoôci) od fragmentu obrazu ciemniejszego do
  32. jaôniejszego i odwrotnie. Zdecydowanie najproôciej jest
  33. zidentyfikowaê bardzo skokowâ, gwaîtownâ zmianë, na przykîad
  34. takâ, jaka wystëpuje na obrazach dwukolorowych. Niestety, na ogóî
  35. zmiana ta jest trochë pîynniejsza, tak jak na rys. 1a. Jeszcze
  36. jeden odrëbny rodzaj przejôcia to punktowe lub liniowe
  37. ôciemnianie (ewentualnie rozjaônianie). Doskonaîym przykîadem
  38. takiej zmiany jasnoôci moûe tu byê obraz pîytek chodnikowych.
  39. Odpowiedni wykres na rys. 1b. Czasami zauwaûyê teû moûemy
  40. przejôcia, które sâ krawëdziami dwóch patternów. Przykîad takiego
  41. obrazu zostaî umieszczony na rys. 1c.
  42.  
  43. Okazuje sië, ûe dla kaûdego z przedstawionych przeze mnie typów
  44. przejôê do poprawnej obróbki potrzebny jest inny algorytm. Na
  45. szczëôcie jednak okazuje sië, ûe wiëkszoôê krawëdzi, jakie
  46. spotykamy, ma wykres zmian jasnoôci zbliûony do rys. 1a, a to
  47. oznacza, ûe analizë obrazu moûemy ograniczyê do tego wîaônie
  48. rodzaju przejôê. Choê na pierwszy rzut oka wydaje sië, ûe
  49. okreôlenie linii podziaîu miëdzy dwoma obiektami jest trudne, to
  50. przy zastosowaniu róûniczkowania funkcji poziomu jasnoôci punktów
  51. sprawa staje sië îatwiejsza. Do roboty!
  52.  
  53. <sr>Analiza zmian jasnoôci
  54.  
  55. ( ***** tu rysunek (rys. 2) ******)
  56.  
  57. <txt>Juû na poczâtku istnienia problemu analizy obrazu zauwaûono,
  58. ûe po obliczeniu pierwszej pochodnej funkcji, która opisuje nam
  59. zmiany szaroôci obrazu, dostaniemy do rëki narzëdzie,
  60. umoûliwiajâce w miarë dokîadne wyznaczenie przebiegu linii
  61. krawëdzi. Przypatrzcie sië rys. 2a. Zauwaûcie, ûe kiedy z
  62. powrotem przedstawimy pierwszâ pochodnâ jako obraz, otrzymamy coô
  63. w rodzaju bardzo efektownie wyglâdajâcej pîaskorzeúby, którâ
  64. znamy z programów typu ImageFX. Po zróûniczkowaniu sygnaîu
  65. wystarczy wykorzystaê odpowiedni próg detekcji podczas
  66. binaryzacji i mamy juû obraz krawëdzi (rys. 2b). Dodatkowâ zaletâ
  67. tego rozwiâzania jest fakt, ûe dla bardziej rozmytych krawëdzi
  68. (îagodniejsze przejôcie) maksimum pierwszej pochodnej ma niûszâ
  69. wartoôê. Jeszcze bardziej jednoznaczne wyniki daje zastosowanie
  70. drugiej pochodnej (rys. 2c). W tym wypadku krawëdú odpowiada
  71. wprost miejscu zerowemu drugiej pochodnej.
  72.  
  73. Oczywiôcie na obrazie komputerowym trudno jest wyznaczaê pochodnâ. 
  74. Jednakûe wystarczajâco dobrym przybliûeniem pochodnej sâ lokalne 
  75. gradienty. Wiëcej o gradientach za miesiâc, a teraz juû pora na...
  76.  
  77. <sr>Asembler!
  78.  
  79. <txt>Po dawce teorii mogë przystâpiê do omówienia algorytmu,
  80. który umoûliwia wykonywanie w czasie rzeczywistym efektu Emboss
  81. (Relief Map) w asemblerze. Obraz analizowaê bëdziemy linia po
  82. linii, poruszajâc sië od lewego górnego rogu do prawego górnego
  83. rogu, a nastëpnie o linië w dóî. I tak do koïca obrazka.
  84. Zakîadam, ûe analizujemy obraz o 256 stopniach szaroôci. Algorytm
  85. pozwala na obróbkë ekranu bez drugiego bufora! Wszystko odbywa
  86. sië w tym samym obszarze pamiëci!
  87.  
  88. 1. Pobieramy wartoôê jasnoôci punktu. Radzë obrazek wejôciowy
  89. trzymaê w postaci "Chunky", co przyspiesza obliczenia (nie musimy
  90. dokonywaê konwersji).
  91.  
  92. 2. Dublujemy sobie gdzieô (np. w innym rejestrze danych) otrzymanâ 
  93. przed chwilâ wartoôê. Przyda sië przy analizie nastëpnego punktu...
  94.  
  95. 3. Odejmujemy od niej wartoôê jasnoôci punktu poîoûonego
  96. bezpoôrednio po lewej stronie aktualnego punktu. Wykorzystujemy
  97. do tego wartoôê otrzymanâ w kroku pierwszym.
  98.  
  99. 4. Otrzymanâ róûnicë, naleûâcâ do przedziaîu: <-256;+255>,
  100. przesuwamy o jeden bit w prawo (ze znakiem) otrzymujâc przedziaî:
  101. <-128;+127>.
  102.  
  103. 5. Dodajemy do róûnicy 128, otrzymujâc wartoôê naleûâcâ do
  104. przedziaîu: <+000;+255>.
  105.  
  106. 6. Zapisujemy jasnoôê punktu w miejsce, z którego pobraliômy
  107. jasnoôê poczâtkowâ w kroku pierwszym.
  108.  
  109. 7. Przechodzimy do analizy nastëpnego punktu, aû do koïca
  110. obrazka. Póúniej ewentualnie dokonujemy konwersji:
  111. Chunky2Planar.
  112.  
  113. Dziô uczynië wyjâtek i zamieszczë gotowâ procedurë:
  114.  
  115. <l>
  116. Emboss:    ;Procedura "Emboss'ujâca" obraz.
  117.  
  118. moveq    #$7F,d0    ;Poczâtkowa jasnoôê (w zasadzie dowolna).
  119.  
  120. moveq    #$0,d1    ;Kasujemy rejestr d1.
  121.  
  122. moveq    #$0,d2    ;Kasujemy rejestr d2.
  123.  
  124. move.w    #160*128-1,d6    ;Ekran o rozmiarach 160*128, dla przykîadu...
  125.  
  126.  
  127. Loop:    ;Gîówna pëtla.
  128.  
  129. move.b    (a0),d1    ;Pobieramy punkt z pod a0-adres punktu na ekranie.
  130.  
  131. move.w    d1,d2    ;Dublujemy go w d2.
  132.  
  133. sub.w    d0,d1    ;Odejmujemy poprzedniâ wartoôê jasnoôci.
  134.  
  135. asr.w    #1,d1    ;Dzielimy przez dwa, zmniejszajâc przedziaî.
  136.  
  137. add.w    #$80,d1    ;Dodajemy 128, aby otrzymaê wartoôê: <000;255>.
  138.  
  139. move.b    d1,(a0)+    ;Zapisujemy przeksztaîcony punkt.
  140.  
  141. move.w    d2,d0    ;Przepisujemy zbuforowanâ jasnoôê punktu do d0.
  142.  
  143. dbf    d6,Loop    ;Powtarzanie pëtli.
  144.  
  145. rts    ;Wyjôcie z procedury.
  146.  
  147.  
  148. <txt>Jak widzicie, caîâ "mâdrâ" teorië sprowadziê moûemy do kilku 
  149. linijek kodu maszynowego! Radzë poeksperymentowaê z podanym przeze 
  150. mnie algorytmem. 
  151.  
  152. Czasem (na przykîad w wypadku maîych róûnic jasnoôci) nie warto
  153. przesuwaê wartoôci o bit w prawo, gdyû otrzymujemy wtedy jedynie
  154. mniej kontrastowy obraz. Polecam teû wykorzystanie funkcji Emboss
  155. (Relief Map) w wypadku efektów dynamicznych (rotator, wektorówka
  156. teksturowana itp.). Maîo wzruszajâcy jest nieruchomy obrazek,
  157. który nagle zamienia sië w pîaskorzeúbë...
  158.  
  159. <sr>Przeksztaîcenia
  160.  
  161. <txt>Na koniec podajë parametry przeksztaîceï, jakie
  162. zaprezentowaîem na ilustracjach. Moûna je wykorzystaê w
  163. programach majâcych funkcjë Convolution (na przykîad ImageFX).
  164. Wiëcej o podobnych macierzach napiszë za miesiâc. Ûyczë miîego
  165. "embossowania"!
  166.  
  167. <l>   Przeksztaîcenie: Emboss High, macierz:
  168.  
  169. 0    0    0    0    0
  170. 0    0    0    0    0
  171. 0    0    1    1    0
  172. 0    0    1    0    1
  173. 0    0    0    1    1
  174.  
  175. Przeksztaîcenie: Emboss Low, macierz:
  176.  
  177. 0    0    0    0    0
  178. 0    0    0    0    0
  179. 0    0    1    0    0
  180. 0    0    0    1    0
  181. 0    0    0    0    0
  182.  
  183. (***** tu rysunki (rys. 3)
  184.  
  185. (rys. 4)
  186.  
  187. (rys. 5)
  188.  
  189. (rys. 6)
  190.  
  191. (rys. 7)
  192.  
  193. (rys. 8)
  194.  
  195. <przyp>Piszâc ten odcinek, opieraîem sië czëôciowo na
  196. informacjach, zawartych w ksiâûce pt. "Komputerowa analiza
  197. obrazu" (FotoBit Design), autorstwa Leszka Wojnara i Mirosîawa
  198. Majorka.
  199.