{"id":115,"date":"2022-07-27T08:59:42","date_gmt":"2022-07-27T08:59:42","guid":{"rendered":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/?post_type=chapter&#038;p=115"},"modified":"2022-12-16T07:47:46","modified_gmt":"2022-12-16T07:47:46","slug":"analiza-obrazu","status":"web-only","type":"chapter","link":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/chapter\/analiza-obrazu\/","title":{"raw":"Analiza obrazu","rendered":"Analiza obrazu"},"content":{"raw":"<p style=\"text-align: justify\">Po etapach akwizycji i przetwarzania wst\u0119pnego mo\u017cemy obraz podda\u0107 dalszej analizie. Spos\u00f3b analizy jest determinowany tym, jak\u0105 informacj\u0119 chcemy uzyska\u0107. W wielu zastosowaniach system\u00f3w wizyjnych, jeste\u015bmy w stanie bardzo \u0142atwo wskaza\u0107 u\u017cyteczne parametry (cechy). Cz\u0119\u015b\u0107 analiz obrazu obejmuje te zwi\u0105zane z kolorami, inne z wyst\u0105pieniem pewnego charakterystycznego wzorca. W cz\u0119\u015bci analiz chcemy wskaza\u0107 pewne wzorce, lub obliczy\u0107 fizyczne wymiary zarejestrowanego obiektu.<\/p>\r\n<p style=\"text-align: justify\">Jedn\u0105 z najprostszych cech obrazu jest rozk\u0142ad cz\u0119sto\u015bci wyst\u0119powania pikseli o zadanym kolorze, nasyceniu lub jasno\u015bci. W takim przypadku mo\u017cemy jako cech\u0119 mo\u017cemy zastosowa\u0107 <strong>histogram obrazu<\/strong>. Histogram przedstawia rozk\u0142ad cz\u0119sto\u015bci wyst\u0119powania na przyk\u0142ad\u00a0 jasno\u015bci pikseli w ca\u0142ym obrazie. Cz\u0119sto\u015b\u0107 wyst\u0119powania pewnych kolor\u00f3w, lub rozk\u0142ad wyst\u0119powania kolor\u00f3w mo\u017ce by\u0107 bardzo u\u017cyteczn\u0105 cech\u0105. Aby wyznaczy\u0107 histogram, mo\u017cemy pos\u0142u\u017cy\u0107 si\u0119 funkcj\u0105 calcHist() lub hist() z biblioteki matplotlib. Na listingu 1 zaprezentowano fragment programu, kt\u00f3ry wyznacza histogram dla obrazu kolorowego i tego samego obrazu o odcieniach szaro\u015bci. Na rysunku 1 zaprezentowano obraz, dla kt\u00f3rego obliczany jest histogram. Na rysunku 2 i 3 zaprezentowano histogramy obliczone dla obrazu o odcieniach szaro\u015bci oraz dla poszczeg\u00f3lnych sk\u0142adowych RGB.<\/p>\r\nListing 1. Program prezentuj\u0105cy obliczanie histogramu .\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('kostka_rubicka.jpg',0)\r\n\r\ncv2.imshow('obraz',img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\nplt.hist(img.ravel(),256,[0,256]); plt.show()\r\n\r\nimg = cv2.imread('kostka_rubicka.jpg')\r\ncolor = ('b','g','r')\r\nfor i,col in enumerate(color):\r\n   histr = cv2.calcHist([img],[i],None,[256],[0,256])\r\n   plt.plot(histr,color = col)\r\n   plt.xlim([0,256])\r\n   plt.show()\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_256\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/kostka_rubicka.jpg\" alt=\"\" class=\"wp-image-256 size-full\" width=\"640\" height=\"331\" \/> Rysunek 1. Obraz dla kt\u00f3rego obliczany jest histogram.[\/caption]\r\n\r\n[caption id=\"attachment_254\" align=\"aligncenter\" width=\"381\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_czb.png\" alt=\"\" class=\"wp-image-254 size-full\" width=\"381\" height=\"248\" \/> Rysunek 2. Histogram dla warto\u015bci intensywno\u015bci [0-255].[\/caption]\r\n\r\n[caption id=\"attachment_255\" align=\"aligncenter\" width=\"383\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_bgr.png\" alt=\"\" class=\"wp-image-255 size-full\" width=\"383\" height=\"248\" \/> Rysunek 3. Histogramy dla poszczeg\u00f3lnych sk\u0142adowych RGB obrazu.[\/caption]\r\n<p style=\"text-align: justify\">W trakcie analizy obrazu, mo\u017cemy by\u0107 zainteresowani wykryciem pewnego koloru na obrazie. W tym celu, mo\u017cemy wybra\u0107 takie piksele, kt\u00f3re mieszcz\u0105 si\u0119 w interesuj\u0105cej nas <strong>przestrzeni barw<\/strong>. W tym celu mo\u017cemy wykorzysta\u0107 nie tylko przestrze\u0144 barw <strong>BGR<\/strong>, ale r\u00f3wnie\u017c <strong>HSV<\/strong>. Aby dokona\u0107 konwersji z przestrzeni BGR na HSV mo\u017cemy wykorzysta\u0107 funkcj\u0119 cvtColor(). Nast\u0119pnie, wykorzystuj\u0105c funkcj\u0119 inRange() mo\u017cemy wskaza\u0107 zakres interesuj\u0105cych nas warto\u015bci kolor\u00f3w w przestrzenie HSV. W ten spos\u00f3b, mo\u017cemy stworzy\u0107 mask\u0119 wskazuj\u0105c\u0105 piksele z naszego przedzia\u0142u. Na listingu 2 zaprezentowano program do wyznaczenie miejsc obrazu prezentuj\u0105cych kolor niebieski. Kluczem odpowiedniej selekcji kolor\u00f3w jest prawid\u0142owy dob\u00f3r zakres\u00f3w. Na rysunku 4 oraz 5 zaprezentowano wyniki dzia\u0142ania programu mask\u0119 oraz obraz prezentuj\u0105cy wykryty kolor.<\/p>\r\nListing 2. Program wyznaczaj\u0105cy mask\u0119 wyst\u0119powania koloru niebieskiego na obrazie.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nframe = cv2.imread('kostka_rubicka.jpg')\r\n\r\nhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\r\n\r\nlower_blue = np.array([100,50,50])\r\nupper_blue = np.array([240,255,255])\r\n\r\nmask = cv2.inRange(hsv, lower_blue, upper_blue)\r\nres = cv2.bitwise_and(frame,frame, mask= mask)\r\n\r\ncv2.imshow('frame',frame)\r\ncv2.waitKey(0)\r\n\r\ncv2.imshow('mask',mask)\r\ncv2.waitKey(0)\r\n\r\ncv2.imshow('res',res)\r\ncv2.waitKey(0)\r\n\r\ncv2.imwrite('wynik_res_blue.jpg', res)\r\ncv2.imwrite('wynik_mask_blue.jpg', mask)\r\n\r\ncv2.destroyAllWindows()\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_259\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_mask_blue.jpg\" alt=\"\" class=\"wp-image-259 size-full\" width=\"640\" height=\"331\" \/> Rysunek 4. Prezentuj\u0105cy mask\u0119 wskazuj\u0105ca kolory oraz kolory.[\/caption]\r\n\r\n&nbsp;\r\n\r\n[caption id=\"attachment_260\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_res_blue.jpg\" alt=\"\" class=\"wp-image-260 size-full\" width=\"640\" height=\"331\" \/> Rysunek 5. Prezentuj\u0105cy mask\u0119 wskazuj\u0105ca kolory oraz kolory.[\/caption]\r\n<p style=\"text-align: justify\">Opr\u00f3cz samych kolor\u00f3w, w trakcie analizy obrazu mo\u017cemy by\u0107 zainteresowani wyodr\u0119bnieniem pewnych znanych <strong>wzorc\u00f3w<\/strong>\/szablon\u00f3w. Mo\u017cemy sobie wyobrazi\u0107, \u017ce naszym wzorcem b\u0119dzie fragment znanego i poszukiwanego obrazu. W takim przypadku, por\u00f3wnuj\u0105c ka\u017cdy piksel naszego wzorca i obrazu, mo\u017cemy obliczy\u0107 podobie\u0144stwo, na przyk\u0142ad z wykorzystaniem wsp\u00f3\u0142czynnika korelacji. Je\u015bli poszukiwany <strong>wzorzec<\/strong> jest mniejszym fragmentem ca\u0142o\u015bci obrazu, to wzorzec mo\u017cemy przesuwa\u0107 co piksel po ca\u0142ym obrazie i oblicza\u0107 wsp\u00f3\u0142czynnik korelacji. W wyniku przesuwania wzorca i obliczenia <strong>wsp\u00f3\u0142czynnika korelacji<\/strong> dla ka\u017cdego obszaru, jeste\u015bmy w stanie wskaza\u0107 obszary obrazu o najwi\u0119kszej korelacji z naszym wzorcem. Pewien \"wysoki\" pr\u00f3g wsp\u00f3\u0142czynnika korelacji, jest wska\u017anikiem znalezienia obszaru zawieraj\u0105cego wzorzec. W zadaniu dopasowywania wzorc\u00f3w mo\u017cemy wykorzysta\u0107 funkcj\u0119 matchTemplate(). Do obliczenia podobie\u0144stwa nie musimy korzysta\u0107 z wsp\u00f3\u0142czynnika korelacji (TM_CCOEFF), ale mo\u017cemy wykorzysta\u0107 inne miary: kwadrat r\u00f3\u017cnicy (TM_SQDIFF), znormalizowana metoda por\u00f3wnywania kwadratu r\u00f3\u017cnicy (TM_SQDIFF_NORMED), korelacja krzy\u017cowa (TM_CCORR), znormalizowana metoda korelacji krzy\u017cowej (TM_CORR_NORMED), znormalizowana metoda dopasowywania wsp\u00f3\u0142czynnika korelacji (TM_CCOEFF_NORMED). Na listingu 3 zaprezentowano program, kt\u00f3ry stosuj\u0105c metod\u0119 dopasowywania wzorca przeszukuje obraz, wyznacza wsp\u00f3\u0142czynniki dopasowania a nast\u0119pnie wskazuje potencjalne wyst\u0105pienie wzorca.<\/p>\r\nListing 3. Program prezentuj\u0105cy metod\u0119 dopasowywania wzorca.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('lewandowski.jpg',0)\r\nimg2 = img.copy()\r\ntemplate = cv2.imread('glowa.jpg',0)\r\nw, h = template.shape[::-1]\r\n\r\nmethods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',\r\n'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']\r\n\r\nfor meth in methods:\r\n   img = img2.copy()\r\n   method = eval(meth)\r\n\r\n   res = cv2.matchTemplate(img,template,method)\r\n   min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)\r\n\r\n   if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:\r\n      top_left = min_loc\r\n   else:\r\n     top_left = max_loc\r\n     bottom_right = (top_left[0] + w, top_left[1] + h)\r\n\r\n   cv2.rectangle(img,top_left, bottom_right, 255, 2)\r\n\r\n   plt.subplot(121),plt.imshow(res,cmap = 'gray')\r\n   plt.title('Matching Result'), plt.xticks([]), plt.yticks([])\r\n   plt.subplot(122),plt.imshow(img,cmap = 'gray')\r\n   plt.title('Detected Point'), plt.xticks([]), plt.yticks([])\r\n   plt.suptitle(meth)\r\n\r\n   plt.show()\r\n\r\n[\/code]\r\n\r\n<p style=\"text-align: justify\">Na rysunku 6 zaprezentowano wyniki obliczonych warto\u015bci dopasowania oraz wykryt\u0105 (najlepsz\u0105) warto\u015b\u0107 dopasowania wraz z zaznaczonym obszarem zawieraj\u0105cym wzorzec. Warto zwr\u00f3ci\u0107 uwag\u0119, \u017ce obraz jest \u0142adowany w odcieniach szaro\u015bci. Nast\u0119pnie na na takim obrazie, dokonywane jest dopasowanie wzorca. W celu wizualizacji oryginalnego obrazu trzeba za\u0142adowa\u0107 obraz kolorowy a nast\u0119pnie nanie\u015b\u0107 na niego prostok\u0105t wskazuj\u0105cy dopasowanie (Rysunek 7).<\/p>\r\n\r\n\r\n[caption id=\"attachment_275\" align=\"aligncenter\" width=\"1524\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja.png\" alt=\"\" class=\"wp-image-275 size-full\" width=\"1524\" height=\"472\" \/> Rysunek 6. Przyk\u0142ad dopasowania wzorca metod\u0105 znormalizowanego kwadratu r\u00f3\u017cnicy.[\/caption]\r\n\r\n&nbsp;\r\n\r\n[caption id=\"attachment_278\" align=\"aligncenter\" width=\"620\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik9.jpg\" alt=\"\" class=\"wp-image-278 size-full\" width=\"620\" height=\"413\" \/> Rysunek 7. Przyk\u0142ad wykrycia wzorca (numeru 9) na obrazie kolorowym.[\/caption]\r\n\r\n&nbsp;\r\n<p style=\"text-align: justify\">W trakcie analizy obrazu, mo\u017cemy chcie\u0107 wykry\u0107 nie tylko jeden obiekt ale wiele obiekt\u00f3w. W takim przypadku musimy zaprezentowa\u0107 wszystkie potencjalne najlepsze punkty powy\u017cej pewnego progu. Przyk\u0142ad programu prezentuj\u0105cego wykrycie czarnego pionka na obrazie szachownicy zaprezentowano na listingu 4.\u00a0 W tym przypadku ustawiono pr\u00f3g wykrycia r\u00f3wny 0.8. Na rysunku 8 zaprezentowano spos\u00f3b wykrycia poszukiwanych element\u00f3w.<\/p>\r\nListing 4. Przyk\u0142ad programu prezentuj\u0105cy wykrycie czarnego pionka w obrazie.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2 as cv\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg_rgb = cv.imread('szachy_a.png')\r\nimg_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)\r\ntemplate = cv.imread('pionek.png',0)\r\n\r\nw, h = template.shape[::-1]\r\nres = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)\r\nthreshold = 0.8\r\nloc = np.where( res = threshold)\r\nfor pt in zip(*loc[::-1]):\r\n   cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)\r\n\r\ncv.imwrite('res.png',img_rgb)\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_281\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_pionki.png\" alt=\"\" class=\"wp-image-281 size-full\" width=\"640\" height=\"640\" \/> Rysunek 8. Obraz szachownicy z wykrytymi elementami.[\/caption]\r\n<p style=\"text-align: justify\">Jedn\u0105 z transformat, kt\u00f3re mo\u017cemy zastosowa\u0107 na obrazie jest <strong>transformata Fouriera<\/strong>. W typowej analizie sygna\u0142\u00f3w zmiennych w czasie, transformata Fouriera mo\u017ce pos\u0142u\u017cy\u0107 do znalezienia cz\u0119stotliwo\u015bci wyst\u0119puj\u0105cych w sygnale. Analiza obrazu z wykorzystaniem transformaty Fouriera pozwala na opisanie, powtarzalno\u015bci w wierszach i kolumnach intensywno\u015bci pikseli w obrazie. W praktyce stosujemy algorytm szybkiego przekszta\u0142cenia Fouriera (FFT). Biblioteka OpenCV i numpy posiada kilka u\u017cytecznych funkcji u\u0142atwiaj\u0105cych obliczenie, przesuni\u0119cie oraz wizualizacj\u0119 wynik\u00f3w transformaty Fouriera. W trakcie wizualizacji wynik\u00f3w FFT obrazu stosujemy przesuni\u0119cie. W takim przypadku, punkt centralny wi\u0105\u017ce si\u0119 z najni\u017cszymi sk\u0142adowymi intensywno\u015bci \"powtarzalno\u015bci\" pikseli. Natomiast im dalej w pionie\/poziomie od punktu centralnego, tym wi\u0119ksze sk\u0142adowe intensywno\u015bci pikseli. Wynik przedstawiamy najcz\u0119\u015bciej w postaci warto\u015bci bezwzgl\u0119dnej amplitudy. Na listingu 5 zaprezentowano program kt\u00f3ry oblicza transformat\u0119 Fouriera na obrazie. Na rysunku 9 przedstawiono obraz wej\u015bciowy, oraz wynik przekszta\u0142cenia Fouriera.<\/p>\r\n<p style=\"text-align: justify\">Listing 5. Program prezentuj\u0105cy spos\u00f3b obliczenia transformaty Fouriera na obrazie.<\/p>\r\n\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('star.jpg',0)\r\nf = np.fft.fft2(img)\r\nfshift = np.fft.fftshift(f)\r\nmagnitude_spectrum = 20*np.log(np.abs(fshift))\r\n\r\nplt.subplot(121),plt.imshow(img, cmap = 'gray')\r\nplt.title('Input Image'), plt.xticks([]), plt.yticks([])\r\nplt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')\r\nplt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])\r\nplt.show()\r\n\r\ncv2.imshow('wynik',magnitude_spectrum);\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncv2.imwrite('po_fft.png',magnitude_spectrum);\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_285\" align=\"alignnone\" width=\"1382\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft.png\" alt=\"\" class=\"wp-image-285 size-full\" width=\"1382\" height=\"656\" \/> Rysunek 9. Obraz wej\u015bciowy, oraz wynik przekszta\u0142cenia Fouriera na obrazie.[\/caption]\r\n<p style=\"text-align: justify\">Interpretacja wyniku dyskretnej transformaty Fouriera na obrazie mo\u017ce by\u0107 ci\u0119\u017ckim zadaniem, w szczeg\u00f3lno\u015bci w pocz\u0105tkowej fazie nauki tego zagadnienia. Istnieje szereg narz\u0119dzi i pomocy u\u0142atwiaj\u0105cych zrozumienie i interpretacj\u0119 uzyskanych wynik\u00f3w. W trakcie nauki warto pos\u0142u\u017cy\u0107 si\u0119 pomocami takimi jak (strona internetowa: http:\/\/bigwww.epfl.ch\/demo\/ip\/demos\/FFT\/ i http:\/\/www.jcrystal.com\/products\/ftlse\/index.htm oraz\u00a0 program http:\/\/www2.kobe-u.ac.jp\/~kuroki\/OpenSoft\/FFT2D\/index_en.html 2D Fast Fourier Transform Software FFT2D Stworzony na Uniwersytecie Kobe). Stworzone oprogramowanie, pozwala na przeprowadzenie serii prostych eksperyment\u00f3w pozwalaj\u0105cych na modyfikacj\u0119 widma i wykonanie odwrotnego przekszta\u0142cenia Fouriera.<\/p>\r\n<p style=\"text-align: justify\">Tworz\u0105c mask\u0119 i usuwaj\u0105c pewne sk\u0142adowe o niskich lub wysokich cz\u0119stotliwo\u015bciach mo\u017cemy \"przefiltrowa\u0107\" obraz z pewnych sk\u0142adowych. Filtr dolnoprzepustowy pozwala na uzyskanie efektu rozmycia, natomiast filtr g\u00f3rnoprzepustowy pozwala na wskazanie kraw\u0119dzi w obrazie. Przyk\u0142ad filtru z wykorzystaniem maskowania i usuni\u0119cia pewnych cz\u0119stotliwo\u015bci przedstawiono na listingu 6. Na rysunkach 10 i 11 zaprezentowano przyk\u0142ady obraz\u00f3w oraz wyniki przekszta\u0142ce\u0144 po\u00a0 <strong>filtrze g\u00f3rno i dolno przepustowym<\/strong>.<\/p>\r\nListing 6. Program przedstawiaj\u0105cy mo\u017cliwo\u015bci modyfikacji transformaty Fouriera.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('szachy.png',cv2.IMREAD_GRAYSCALE)\r\nimg = cv2.resize(img,(len(img[0])\/\/2,len(img)\/\/2))\r\n\r\nrows, cols = img.shape\r\ncrow,ccol = rows\/2 , cols\/2\r\n\r\ndft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)\r\ndft_shift = np.fft.fftshift(dft)\r\n\r\n\r\nmask = np.zeros((rows,cols,2),np.uint8)\r\nmask[round(crow)-30:round(crow)+30, round(ccol)-30:round(ccol)+30] = 1\r\n#mask = 1-mask\r\n\r\n\r\nfshift = dft_shift*mask\r\nf_ishift = np.fft.ifftshift(fshift)\r\nimg_back = cv2.idft(f_ishift)\r\nimg_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])\r\n\r\nplt.subplot(121),plt.imshow(img, cmap = 'gray')\r\nplt.title('Input Image'), plt.xticks([]), plt.yticks([])\r\nplt.subplot(122),plt.imshow(img_back, cmap = 'gray')\r\nplt.title('Output Image'), plt.xticks([]), plt.yticks([])\r\nplt.show()\r\n[\/code]\r\n\r\n[caption id=\"attachment_289\" align=\"alignnone\" width=\"1390\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft.png\" alt=\"\" class=\"wp-image-289 size-full\" width=\"1390\" height=\"628\" \/> Rysunek 10.\u00a0 Obraz wej\u015bciowy oraz obraz po filtrze dolnoprzepustowym.[\/caption]\r\n\r\n[caption id=\"attachment_290\" align=\"aligncenter\" width=\"1256\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2.png\" alt=\"\" class=\"wp-image-290 size-full\" width=\"1256\" height=\"565\" \/> Rysunek 11. Obraz wej\u015bciowy oraz obraz po filtrze g\u00f3rnoprzepustowym.[\/caption]\r\n\r\n&nbsp;\r\n<p style=\"text-align: justify\">Innym wa\u017cnym zagadnieniem, jest wykrycie prostych kszta\u0142t\u00f3w w obrazie takich jak linia lub okr\u0105g. W takim zadaniu mo\u017cemy wykorzysta\u0107 <strong>transformat\u0119 Hougha<\/strong>. Transformata jest relatywnie szybk\u0105 metod\u0105 wyszukiwania kszta\u0142t\u00f3w. Jednak wymaga przeszukania wszystkich mo\u017cliwych prostych\/okr\u0119g\u00f3w na obrazie. Dla przyk\u0142adu, ka\u017cda prost\u0105 mo\u017cemy przedstawi\u0107 jako jej k\u0105t nachylenia oraz punkt przeci\u0119cia z osi\u0105 wsp\u00f3\u0142rz\u0119dnych. Je\u015bli dla ka\u017cdej mo\u017cliwej prostej, zsumujemy potencjalne punkty niezerowe obrazu le\u017c\u0105ce na tej prostej to mo\u017cemy wykry\u0107 potencjalne linie. W praktyce, aby wykorzysta\u0107 transformat\u0119 nale\u017cy skorzysta\u0107 z gotowych funkcji do detekcji linii HoughLines() oraz HoughCircles(). W trakcie znalezienia potencjalnych kszta\u0142t\u00f3w kluczowe s\u0105 parametry wej\u015bciowe funkcji. Przed transformat\u0105 Hougha stosuje si\u0119 najcz\u0119\u015bciej wykrycie kraw\u0119dzi. Na listingu 7 zaprezentowano program wykrywaj\u0105cy linie. Na rysunku 12 zaprezentowano po\u015bredni etap wykrycia linii- obraz po wykryciu kraw\u0119dzi. Na rysunku 13 zaprezentowano obraz z wykrytymi liniami.<\/p>\r\nLisnting 7. Program wykrywaj\u0105cy linie z wykorzystaniem transformaty Hougha.\r\n\r\n[code lang=\"python\"]\r\nimport cv2\r\nimport numpy as np\r\n\r\ndave = cv2.imread('szachownica.png')\r\ndave1 = cv2.cvtColor(dave,cv2.COLOR_BGR2GRAY)\r\ndave2 = cv2.Canny(dave1,100,200,apertureSize = 3)\r\n\r\ncv2.imshow('image',dave2)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\nlines = cv2.HoughLines(dave2,1,np.pi\/20,500)\r\n\r\nfor linea in lines:\r\n   for rho,theta in linea:\r\n      a = np.cos(theta)\r\n      b = np.sin(theta)\r\n      x0 = a*rho\r\n      y0 = b*rho\r\n      x1 = int(x0 + 1000*(-b))\r\n      y1 = int(y0 + 1000*(a))\r\n      x2 = int(x0 - 1000*(-b))\r\n      y2 = int(y0 - 1000*(a))\r\n\r\n    cv2.line(dave,(x1,y1),(x2,y2),(0,0,255),3)\r\n\r\ncv2.imshow('image',dave)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_296\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini_canny.jpg\" alt=\"\" class=\"wp-image-296 size-full\" width=\"640\" height=\"640\" \/> Rysunek 12. Obraz po zastosowaniu wykrywania kraw\u0119dzi.[\/caption]\r\n\r\n[caption id=\"attachment_295\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini.jpg\" alt=\"\" class=\"wp-image-295 size-full\" width=\"640\" height=\"640\" \/> Rysunek 13. Obraz po wykryciu kraw\u0119dzi.[\/caption]\r\n\r\n&nbsp;\r\n<p style=\"text-align: justify\">Aby wykona\u0107 detekcj\u0119 okr\u0119g\u00f3w nale\u017cy wykorzysta\u0107 funkcj\u0119 HoughCircles(). Zamiast wykrycia kraw\u0119dzi mo\u017cemy zastosowa\u0107 filtr rozmycia. Przyk\u0142ad wykrycia okr\u0119g\u00f3w na obrazie zaprezentowano na listingu 8. Obraz wej\u015bciowy na kt\u00f3rym chcemy dokona\u0107 detekcji zaprezentowano na rysunku 14. Na rysunku 15 zaprezentowano wykryte okr\u0119gi. Aby wykry\u0107 okr\u0119gi kluczowe s\u0105 parametry detekcji param1=150, param2=130, minRadius=50, maxRadius=500. Zmieniaj\u0105c parametry mo\u017cemy zaw\u0119zi\u0107 lub rozszerzy\u0107 zakres poszukiwanych obiekt\u00f3w.<\/p>\r\n&nbsp;\r\n\r\nListing 8. Program prezentuj\u0105cy wykrycie okr\u0119g\u00f3w na obrazie.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nimg = cv2.imread('rower_a.png',0)\r\nimg = cv2.medianBlur(img,5)\r\ncimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)\r\n\r\ncv2.imshow('detected circles',img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncircles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,200,\r\nparam1=150,param2=130,minRadius=50,maxRadius=500)\r\n\r\ncircles = np.uint16(np.around(circles))\r\nfor i in circles[0,:]:\r\ncv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)\r\ncv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)\r\n\r\ncv2.imshow('detected circles',cimg)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\ncv2.imwrite('wynik_detekcji.png',cimg)\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_298\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/rower_a.png\" alt=\"\" class=\"wp-image-298 size-full\" width=\"640\" height=\"450\" \/> Rysunek 14. Obraz na kt\u00f3rym pr\u00f3bujemy wykry\u0107 okr\u0119gi.[\/caption]\r\n\r\n&nbsp;\r\n\r\n[caption id=\"attachment_299\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji.png\" alt=\"\" class=\"wp-image-299 size-full\" width=\"640\" height=\"450\" \/> Rysunek 15. Obraz prezentuj\u0105cy wykryte okr\u0119gi.[\/caption]\r\n\r\n&nbsp;\r\n\r\n<strong>Zadanie 1.<\/strong>\r\n<p style=\"text-align: justify\">Dla obrazu zaprezentowanego na Rysunku 1 przedstawiaj\u0105cego uk\u0142adanie kostki Rubicka, prosz\u0119 wykry\u0107 kolor czerwony a nast\u0119pnie kolor zielony. Prosz\u0119 zmodyfikowa\u0107 program tak, aby zapisywa\u0142 w pliku graficznym mask\u0119 wykrytego koloru.<\/p>\r\n<strong>Odpowied\u017a 1.<\/strong>\r\n<p style=\"text-align: justify\">Nale\u017cy zmodyfikowa\u0107 fragment programu zaprezentowanego na listingu 2. Modyfikacji nale\u017cy dokona\u0107 zaprezentowanych poni\u017cej. Aby u\u0142atwi\u0107 dob\u00f3r zakresu parametr\u00f3w kolor\u00f3w w przestrzeni HSV mo\u017cna u\u017cy\u0107 og\u00f3lnodost\u0119pnego kalkulatora\/konwertera przestrzeni barw (https:\/\/www.rapidtables.com\/convert\/color\/rgb-to-hsv.html https:\/\/www.peko-step.com\/en\/tool\/hsvrgb_en.html).<\/p>\r\n\r\n\r\n[code lang=\"python\"]\r\n\r\nlower_blue = np.array([100,50,50])\r\nupper_blue = np.array([240,255,255])\r\nmask = cv2.inRange(hsv, lower_blue, upper_blue)\r\nres = cv2.bitwise_and(frame,frame, mask= mask)\r\n\r\n[\/code]\r\n\r\n&nbsp;\r\n\r\n<strong>Zadanie 2.<\/strong>\r\n\r\nProsz\u0119 wyznaczy\u0107 histogramy dla kilku obraz\u00f3w: krajobrazu, znaku graficznego, fotografii prezentuj\u0105cej twarz, znak drogowy. Nale\u017cy zaprezentowa\u0107 histogramy dla obrazu o odcieniach szaro\u015bci oraz histogramu dla kolejnych sk\u0142adowych BGR.\r\n\r\n<strong>Odpowied\u017a 2.<\/strong>\r\n\r\nProgram obliczaj\u0105cy histogramy zaprezentowano na listingu poni\u017cej.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('obraz_wejsciowy.jpg',0)\r\n\r\ncv2.imshow('obraz',img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\nplt.hist(img.ravel(),256,[0,256]); plt.show()\r\n\r\nimg = cv2.imread('kostka_rubicka.jpg')\r\ncolor = ('b','g','r')\r\nfor i,col in enumerate(color):\r\n   histr = cv2.calcHist([img],[i],None,[256],[0,256])\r\n   plt.plot(histr,color = col)\r\n   plt.xlim([0,256])\r\n   plt.show()\r\n\r\n[\/code]\r\n\r\n<strong>Zadanie 3.<\/strong>\r\n\r\nProsz\u0119 zaimplementowa\u0107 program wyszukuj\u0105cy bia\u0142e pionki na szachwonicy. Jako obraz wej\u015bciowy prosz\u0119 zastosowac obraz szachownicy z Rysunku 7.\r\n\r\n<strong>Odpowied\u017a 3.<\/strong>\r\n\r\nNale\u017cy stworzy\u0107 wzorzec prezentuj\u0105cy fragment obrazu zawieraj\u0105cy bia\u0142y pionek. Nast\u0119pnie nale\u017cy wykorzysta\u0107 program zaprezentowany na listingu 4.\r\n\r\n&nbsp;\r\n\r\n<strong>Zadanie 4.<\/strong>\r\n<p style=\"text-align: justify\">Prosz\u0119 zaimplementowa\u0107 program oraz dostosowa\u0107 parametry w celu wykrycia linii na obrazach przedstawiaj\u0105cych: drog\u0119 wraz z pasami ruchu, znak graficzny zawieraj\u0105cy linie.<\/p>\r\n<strong>Odpowied\u017a 4.<\/strong>\r\n\r\nNale\u017cy zmodyfikowa\u0107 program na listingu poni\u017cej. Nale\u017cy dobra\u0107 parametry funkcji HoughLines().\r\n\r\n[code lang=\"python\"]\r\nimport cv2\r\nimport numpy as np\r\n\r\ndave = cv2.imread('grafika.png')\r\ndave1 = cv2.cvtColor(dave,cv2.COLOR_BGR2GRAY)\r\ndave2 = cv2.Canny(dave1,100,200,apertureSize = 3)\r\n\r\ncv2.imshow('image',dave2)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\nlines = cv2.HoughLines(dave2,1,np.pi\/20,500)\r\n\r\nfor linea in lines:\r\n   for rho,theta in linea:\r\n      a = np.cos(theta)\r\n      b = np.sin(theta)\r\n      x0 = a*rho\r\n      y0 = b*rho\r\n      x1 = int(x0 + 1000*(-b))\r\n      y1 = int(y0 + 1000*(a))\r\n      x2 = int(x0 - 1000*(-b))\r\n      y2 = int(y0 - 1000*(a))\r\n\r\n      cv2.line(dave,(x1,y1),(x2,y2),(0,0,255),3)\r\n\r\ncv2.imshow('image',dave)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n[\/code]\r\n\r\n&nbsp;\r\n\r\n<strong>Zadanie 5.<\/strong>\r\n\r\nProsz\u0119 zaimplementowa\u0107 program oraz dostosowa\u0107 parametry w celu wykrycia okr\u0119g\u00f3w na obrazach przedstawiaj\u0105cych: monety, \u017arenic\u0119 oka, grafik\u0119 zawieraj\u0105c\u0105 okr\u0119gi o r\u00f3\u017cnej \u015brednicy i kolorze .\r\n\r\n<strong>Odpowied\u017a 5.<\/strong>\r\n\r\nNale\u017cy zmodyfikowa\u0107 program na listingu poni\u017cej. Nale\u017cy dobra\u0107 parametry funkcji HoughCircles().\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nimg = cv2.imread('rower_a.png',0)\r\nimg = cv2.medianBlur(img,5)\r\ncimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)\r\n\r\ncv2.imshow('detected circles',img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncircles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,200,\r\nparam1=150,param2=130,minRadius=50,maxRadius=500)\r\n\r\ncircles = np.uint16(np.around(circles))\r\nfor i in circles[0,:]:\r\n\r\ncv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)\r\n\r\ncv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)\r\n\r\ncv2.imshow('detected circles',cimg)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\ncv2.imwrite('wynik_detekcji.png',cimg)\r\n\r\n[\/code]\r\n\r\n&nbsp;\r\n\r\n&nbsp;","rendered":"<p style=\"text-align: justify\">Po etapach akwizycji i przetwarzania wst\u0119pnego mo\u017cemy obraz podda\u0107 dalszej analizie. Spos\u00f3b analizy jest determinowany tym, jak\u0105 informacj\u0119 chcemy uzyska\u0107. W wielu zastosowaniach system\u00f3w wizyjnych, jeste\u015bmy w stanie bardzo \u0142atwo wskaza\u0107 u\u017cyteczne parametry (cechy). Cz\u0119\u015b\u0107 analiz obrazu obejmuje te zwi\u0105zane z kolorami, inne z wyst\u0105pieniem pewnego charakterystycznego wzorca. W cz\u0119\u015bci analiz chcemy wskaza\u0107 pewne wzorce, lub obliczy\u0107 fizyczne wymiary zarejestrowanego obiektu.<\/p>\n<p style=\"text-align: justify\">Jedn\u0105 z najprostszych cech obrazu jest rozk\u0142ad cz\u0119sto\u015bci wyst\u0119powania pikseli o zadanym kolorze, nasyceniu lub jasno\u015bci. W takim przypadku mo\u017cemy jako cech\u0119 mo\u017cemy zastosowa\u0107 <strong>histogram obrazu<\/strong>. Histogram przedstawia rozk\u0142ad cz\u0119sto\u015bci wyst\u0119powania na przyk\u0142ad\u00a0 jasno\u015bci pikseli w ca\u0142ym obrazie. Cz\u0119sto\u015b\u0107 wyst\u0119powania pewnych kolor\u00f3w, lub rozk\u0142ad wyst\u0119powania kolor\u00f3w mo\u017ce by\u0107 bardzo u\u017cyteczn\u0105 cech\u0105. Aby wyznaczy\u0107 histogram, mo\u017cemy pos\u0142u\u017cy\u0107 si\u0119 funkcj\u0105 calcHist() lub hist() z biblioteki matplotlib. Na listingu 1 zaprezentowano fragment programu, kt\u00f3ry wyznacza histogram dla obrazu kolorowego i tego samego obrazu o odcieniach szaro\u015bci. Na rysunku 1 zaprezentowano obraz, dla kt\u00f3rego obliczany jest histogram. Na rysunku 2 i 3 zaprezentowano histogramy obliczone dla obrazu o odcieniach szaro\u015bci oraz dla poszczeg\u00f3lnych sk\u0142adowych RGB.<\/p>\n<p>Listing 1. Program prezentuj\u0105cy obliczanie histogramu .<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('kostka_rubicka.jpg',0)\r\n\r\ncv2.imshow('obraz',img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\nplt.hist(img.ravel(),256,&#x5b;0,256]); plt.show()\r\n\r\nimg = cv2.imread('kostka_rubicka.jpg')\r\ncolor = ('b','g','r')\r\nfor i,col in enumerate(color):\r\n   histr = cv2.calcHist(&#x5b;img],&#x5b;i],None,&#x5b;256],&#x5b;0,256])\r\n   plt.plot(histr,color = col)\r\n   plt.xlim(&#x5b;0,256])\r\n   plt.show()\r\n\r\n<\/pre>\n<figure id=\"attachment_256\" aria-describedby=\"caption-attachment-256\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/kostka_rubicka.jpg\" alt=\"\" class=\"wp-image-256 size-full\" width=\"640\" height=\"331\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/kostka_rubicka.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/kostka_rubicka-300x155.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/kostka_rubicka-65x34.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/kostka_rubicka-225x116.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/kostka_rubicka-350x181.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-256\" class=\"wp-caption-text\">Rysunek 1. Obraz dla kt\u00f3rego obliczany jest histogram.<\/figcaption><\/figure>\n<figure id=\"attachment_254\" aria-describedby=\"caption-attachment-254\" style=\"width: 381px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_czb.png\" alt=\"\" class=\"wp-image-254 size-full\" width=\"381\" height=\"248\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_czb.png 381w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_czb-300x195.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_czb-65x42.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_czb-225x146.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_czb-350x228.png 350w\" sizes=\"(max-width: 381px) 100vw, 381px\" \/><figcaption id=\"caption-attachment-254\" class=\"wp-caption-text\">Rysunek 2. Histogram dla warto\u015bci intensywno\u015bci [0-255].<\/figcaption><\/figure>\n<figure id=\"attachment_255\" aria-describedby=\"caption-attachment-255\" style=\"width: 383px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_bgr.png\" alt=\"\" class=\"wp-image-255 size-full\" width=\"383\" height=\"248\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_bgr.png 383w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_bgr-300x194.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_bgr-65x42.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_bgr-225x146.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/histogram_bgr-350x227.png 350w\" sizes=\"(max-width: 383px) 100vw, 383px\" \/><figcaption id=\"caption-attachment-255\" class=\"wp-caption-text\">Rysunek 3. Histogramy dla poszczeg\u00f3lnych sk\u0142adowych RGB obrazu.<\/figcaption><\/figure>\n<p style=\"text-align: justify\">W trakcie analizy obrazu, mo\u017cemy by\u0107 zainteresowani wykryciem pewnego koloru na obrazie. W tym celu, mo\u017cemy wybra\u0107 takie piksele, kt\u00f3re mieszcz\u0105 si\u0119 w interesuj\u0105cej nas <strong>przestrzeni barw<\/strong>. W tym celu mo\u017cemy wykorzysta\u0107 nie tylko przestrze\u0144 barw <strong>BGR<\/strong>, ale r\u00f3wnie\u017c <strong>HSV<\/strong>. Aby dokona\u0107 konwersji z przestrzeni BGR na HSV mo\u017cemy wykorzysta\u0107 funkcj\u0119 cvtColor(). Nast\u0119pnie, wykorzystuj\u0105c funkcj\u0119 inRange() mo\u017cemy wskaza\u0107 zakres interesuj\u0105cych nas warto\u015bci kolor\u00f3w w przestrzenie HSV. W ten spos\u00f3b, mo\u017cemy stworzy\u0107 mask\u0119 wskazuj\u0105c\u0105 piksele z naszego przedzia\u0142u. Na listingu 2 zaprezentowano program do wyznaczenie miejsc obrazu prezentuj\u0105cych kolor niebieski. Kluczem odpowiedniej selekcji kolor\u00f3w jest prawid\u0142owy dob\u00f3r zakres\u00f3w. Na rysunku 4 oraz 5 zaprezentowano wyniki dzia\u0142ania programu mask\u0119 oraz obraz prezentuj\u0105cy wykryty kolor.<\/p>\n<p>Listing 2. Program wyznaczaj\u0105cy mask\u0119 wyst\u0119powania koloru niebieskiego na obrazie.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nframe = cv2.imread('kostka_rubicka.jpg')\r\n\r\nhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\r\n\r\nlower_blue = np.array(&#x5b;100,50,50])\r\nupper_blue = np.array(&#x5b;240,255,255])\r\n\r\nmask = cv2.inRange(hsv, lower_blue, upper_blue)\r\nres = cv2.bitwise_and(frame,frame, mask= mask)\r\n\r\ncv2.imshow('frame',frame)\r\ncv2.waitKey(0)\r\n\r\ncv2.imshow('mask',mask)\r\ncv2.waitKey(0)\r\n\r\ncv2.imshow('res',res)\r\ncv2.waitKey(0)\r\n\r\ncv2.imwrite('wynik_res_blue.jpg', res)\r\ncv2.imwrite('wynik_mask_blue.jpg', mask)\r\n\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<figure id=\"attachment_259\" aria-describedby=\"caption-attachment-259\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_mask_blue.jpg\" alt=\"\" class=\"wp-image-259 size-full\" width=\"640\" height=\"331\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_mask_blue.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_mask_blue-300x155.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_mask_blue-65x34.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_mask_blue-225x116.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_mask_blue-350x181.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-259\" class=\"wp-caption-text\">Rysunek 4. Prezentuj\u0105cy mask\u0119 wskazuj\u0105ca kolory oraz kolory.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_260\" aria-describedby=\"caption-attachment-260\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_res_blue.jpg\" alt=\"\" class=\"wp-image-260 size-full\" width=\"640\" height=\"331\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_res_blue.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_res_blue-300x155.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_res_blue-65x34.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_res_blue-225x116.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_res_blue-350x181.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-260\" class=\"wp-caption-text\">Rysunek 5. Prezentuj\u0105cy mask\u0119 wskazuj\u0105ca kolory oraz kolory.<\/figcaption><\/figure>\n<p style=\"text-align: justify\">Opr\u00f3cz samych kolor\u00f3w, w trakcie analizy obrazu mo\u017cemy by\u0107 zainteresowani wyodr\u0119bnieniem pewnych znanych <strong>wzorc\u00f3w<\/strong>\/szablon\u00f3w. Mo\u017cemy sobie wyobrazi\u0107, \u017ce naszym wzorcem b\u0119dzie fragment znanego i poszukiwanego obrazu. W takim przypadku, por\u00f3wnuj\u0105c ka\u017cdy piksel naszego wzorca i obrazu, mo\u017cemy obliczy\u0107 podobie\u0144stwo, na przyk\u0142ad z wykorzystaniem wsp\u00f3\u0142czynnika korelacji. Je\u015bli poszukiwany <strong>wzorzec<\/strong> jest mniejszym fragmentem ca\u0142o\u015bci obrazu, to wzorzec mo\u017cemy przesuwa\u0107 co piksel po ca\u0142ym obrazie i oblicza\u0107 wsp\u00f3\u0142czynnik korelacji. W wyniku przesuwania wzorca i obliczenia <strong>wsp\u00f3\u0142czynnika korelacji<\/strong> dla ka\u017cdego obszaru, jeste\u015bmy w stanie wskaza\u0107 obszary obrazu o najwi\u0119kszej korelacji z naszym wzorcem. Pewien &#8222;wysoki&#8221; pr\u00f3g wsp\u00f3\u0142czynnika korelacji, jest wska\u017anikiem znalezienia obszaru zawieraj\u0105cego wzorzec. W zadaniu dopasowywania wzorc\u00f3w mo\u017cemy wykorzysta\u0107 funkcj\u0119 matchTemplate(). Do obliczenia podobie\u0144stwa nie musimy korzysta\u0107 z wsp\u00f3\u0142czynnika korelacji (TM_CCOEFF), ale mo\u017cemy wykorzysta\u0107 inne miary: kwadrat r\u00f3\u017cnicy (TM_SQDIFF), znormalizowana metoda por\u00f3wnywania kwadratu r\u00f3\u017cnicy (TM_SQDIFF_NORMED), korelacja krzy\u017cowa (TM_CCORR), znormalizowana metoda korelacji krzy\u017cowej (TM_CORR_NORMED), znormalizowana metoda dopasowywania wsp\u00f3\u0142czynnika korelacji (TM_CCOEFF_NORMED). Na listingu 3 zaprezentowano program, kt\u00f3ry stosuj\u0105c metod\u0119 dopasowywania wzorca przeszukuje obraz, wyznacza wsp\u00f3\u0142czynniki dopasowania a nast\u0119pnie wskazuje potencjalne wyst\u0105pienie wzorca.<\/p>\n<p>Listing 3. Program prezentuj\u0105cy metod\u0119 dopasowywania wzorca.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('lewandowski.jpg',0)\r\nimg2 = img.copy()\r\ntemplate = cv2.imread('glowa.jpg',0)\r\nw, h = template.shape&#x5b;::-1]\r\n\r\nmethods = &#x5b;'cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',\r\n'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']\r\n\r\nfor meth in methods:\r\n   img = img2.copy()\r\n   method = eval(meth)\r\n\r\n   res = cv2.matchTemplate(img,template,method)\r\n   min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)\r\n\r\n   if method in &#x5b;cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:\r\n      top_left = min_loc\r\n   else:\r\n     top_left = max_loc\r\n     bottom_right = (top_left&#x5b;0] + w, top_left&#x5b;1] + h)\r\n\r\n   cv2.rectangle(img,top_left, bottom_right, 255, 2)\r\n\r\n   plt.subplot(121),plt.imshow(res,cmap = 'gray')\r\n   plt.title('Matching Result'), plt.xticks(&#x5b;]), plt.yticks(&#x5b;])\r\n   plt.subplot(122),plt.imshow(img,cmap = 'gray')\r\n   plt.title('Detected Point'), plt.xticks(&#x5b;]), plt.yticks(&#x5b;])\r\n   plt.suptitle(meth)\r\n\r\n   plt.show()\r\n\r\n<\/pre>\n<p style=\"text-align: justify\">Na rysunku 6 zaprezentowano wyniki obliczonych warto\u015bci dopasowania oraz wykryt\u0105 (najlepsz\u0105) warto\u015b\u0107 dopasowania wraz z zaznaczonym obszarem zawieraj\u0105cym wzorzec. Warto zwr\u00f3ci\u0107 uwag\u0119, \u017ce obraz jest \u0142adowany w odcieniach szaro\u015bci. Nast\u0119pnie na na takim obrazie, dokonywane jest dopasowanie wzorca. W celu wizualizacji oryginalnego obrazu trzeba za\u0142adowa\u0107 obraz kolorowy a nast\u0119pnie nanie\u015b\u0107 na niego prostok\u0105t wskazuj\u0105cy dopasowanie (Rysunek 7).<\/p>\n<figure id=\"attachment_275\" aria-describedby=\"caption-attachment-275\" style=\"width: 1524px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja.png\" alt=\"\" class=\"wp-image-275 size-full\" width=\"1524\" height=\"472\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja.png 1524w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja-300x93.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja-1024x317.png 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja-768x238.png 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja-65x20.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja-225x70.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/pilka_detekcja-350x108.png 350w\" sizes=\"(max-width: 1524px) 100vw, 1524px\" \/><figcaption id=\"caption-attachment-275\" class=\"wp-caption-text\">Rysunek 6. Przyk\u0142ad dopasowania wzorca metod\u0105 znormalizowanego kwadratu r\u00f3\u017cnicy.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_278\" aria-describedby=\"caption-attachment-278\" style=\"width: 620px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik9.jpg\" alt=\"\" class=\"wp-image-278 size-full\" width=\"620\" height=\"413\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik9.jpg 620w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik9-300x200.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik9-65x43.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik9-225x150.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik9-350x233.jpg 350w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><figcaption id=\"caption-attachment-278\" class=\"wp-caption-text\">Rysunek 7. Przyk\u0142ad wykrycia wzorca (numeru 9) na obrazie kolorowym.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">W trakcie analizy obrazu, mo\u017cemy chcie\u0107 wykry\u0107 nie tylko jeden obiekt ale wiele obiekt\u00f3w. W takim przypadku musimy zaprezentowa\u0107 wszystkie potencjalne najlepsze punkty powy\u017cej pewnego progu. Przyk\u0142ad programu prezentuj\u0105cego wykrycie czarnego pionka na obrazie szachownicy zaprezentowano na listingu 4.\u00a0 W tym przypadku ustawiono pr\u00f3g wykrycia r\u00f3wny 0.8. Na rysunku 8 zaprezentowano spos\u00f3b wykrycia poszukiwanych element\u00f3w.<\/p>\n<p>Listing 4. Przyk\u0142ad programu prezentuj\u0105cy wykrycie czarnego pionka w obrazie.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2 as cv\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg_rgb = cv.imread('szachy_a.png')\r\nimg_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)\r\ntemplate = cv.imread('pionek.png',0)\r\n\r\nw, h = template.shape&#x5b;::-1]\r\nres = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)\r\nthreshold = 0.8\r\nloc = np.where( res = threshold)\r\nfor pt in zip(*loc&#x5b;::-1]):\r\n   cv.rectangle(img_rgb, pt, (pt&#x5b;0] + w, pt&#x5b;1] + h), (0,0,255), 2)\r\n\r\ncv.imwrite('res.png',img_rgb)\r\n\r\n<\/pre>\n<figure id=\"attachment_281\" aria-describedby=\"caption-attachment-281\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_pionki.png\" alt=\"\" class=\"wp-image-281 size-full\" width=\"640\" height=\"640\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_pionki.png 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_pionki-300x300.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_pionki-150x150.png 150w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_pionki-65x65.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_pionki-225x225.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_pionki-350x350.png 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-281\" class=\"wp-caption-text\">Rysunek 8. Obraz szachownicy z wykrytymi elementami.<\/figcaption><\/figure>\n<p style=\"text-align: justify\">Jedn\u0105 z transformat, kt\u00f3re mo\u017cemy zastosowa\u0107 na obrazie jest <strong>transformata Fouriera<\/strong>. W typowej analizie sygna\u0142\u00f3w zmiennych w czasie, transformata Fouriera mo\u017ce pos\u0142u\u017cy\u0107 do znalezienia cz\u0119stotliwo\u015bci wyst\u0119puj\u0105cych w sygnale. Analiza obrazu z wykorzystaniem transformaty Fouriera pozwala na opisanie, powtarzalno\u015bci w wierszach i kolumnach intensywno\u015bci pikseli w obrazie. W praktyce stosujemy algorytm szybkiego przekszta\u0142cenia Fouriera (FFT). Biblioteka OpenCV i numpy posiada kilka u\u017cytecznych funkcji u\u0142atwiaj\u0105cych obliczenie, przesuni\u0119cie oraz wizualizacj\u0119 wynik\u00f3w transformaty Fouriera. W trakcie wizualizacji wynik\u00f3w FFT obrazu stosujemy przesuni\u0119cie. W takim przypadku, punkt centralny wi\u0105\u017ce si\u0119 z najni\u017cszymi sk\u0142adowymi intensywno\u015bci &#8222;powtarzalno\u015bci&#8221; pikseli. Natomiast im dalej w pionie\/poziomie od punktu centralnego, tym wi\u0119ksze sk\u0142adowe intensywno\u015bci pikseli. Wynik przedstawiamy najcz\u0119\u015bciej w postaci warto\u015bci bezwzgl\u0119dnej amplitudy. Na listingu 5 zaprezentowano program kt\u00f3ry oblicza transformat\u0119 Fouriera na obrazie. Na rysunku 9 przedstawiono obraz wej\u015bciowy, oraz wynik przekszta\u0142cenia Fouriera.<\/p>\n<p style=\"text-align: justify\">Listing 5. Program prezentuj\u0105cy spos\u00f3b obliczenia transformaty Fouriera na obrazie.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('star.jpg',0)\r\nf = np.fft.fft2(img)\r\nfshift = np.fft.fftshift(f)\r\nmagnitude_spectrum = 20*np.log(np.abs(fshift))\r\n\r\nplt.subplot(121),plt.imshow(img, cmap = 'gray')\r\nplt.title('Input Image'), plt.xticks(&#x5b;]), plt.yticks(&#x5b;])\r\nplt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')\r\nplt.title('Magnitude Spectrum'), plt.xticks(&#x5b;]), plt.yticks(&#x5b;])\r\nplt.show()\r\n\r\ncv2.imshow('wynik',magnitude_spectrum);\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncv2.imwrite('po_fft.png',magnitude_spectrum);\r\n\r\n<\/pre>\n<figure id=\"attachment_285\" aria-describedby=\"caption-attachment-285\" style=\"width: 1382px\" class=\"wp-caption alignnone\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft.png\" alt=\"\" class=\"wp-image-285 size-full\" width=\"1382\" height=\"656\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft.png 1382w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft-300x142.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft-1024x486.png 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft-768x365.png 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft-65x31.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft-225x107.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/przyklad_fft-350x166.png 350w\" sizes=\"(max-width: 1382px) 100vw, 1382px\" \/><figcaption id=\"caption-attachment-285\" class=\"wp-caption-text\">Rysunek 9. Obraz wej\u015bciowy, oraz wynik przekszta\u0142cenia Fouriera na obrazie.<\/figcaption><\/figure>\n<p style=\"text-align: justify\">Interpretacja wyniku dyskretnej transformaty Fouriera na obrazie mo\u017ce by\u0107 ci\u0119\u017ckim zadaniem, w szczeg\u00f3lno\u015bci w pocz\u0105tkowej fazie nauki tego zagadnienia. Istnieje szereg narz\u0119dzi i pomocy u\u0142atwiaj\u0105cych zrozumienie i interpretacj\u0119 uzyskanych wynik\u00f3w. W trakcie nauki warto pos\u0142u\u017cy\u0107 si\u0119 pomocami takimi jak (strona internetowa: http:\/\/bigwww.epfl.ch\/demo\/ip\/demos\/FFT\/ i http:\/\/www.jcrystal.com\/products\/ftlse\/index.htm oraz\u00a0 program http:\/\/www2.kobe-u.ac.jp\/~kuroki\/OpenSoft\/FFT2D\/index_en.html 2D Fast Fourier Transform Software FFT2D Stworzony na Uniwersytecie Kobe). Stworzone oprogramowanie, pozwala na przeprowadzenie serii prostych eksperyment\u00f3w pozwalaj\u0105cych na modyfikacj\u0119 widma i wykonanie odwrotnego przekszta\u0142cenia Fouriera.<\/p>\n<p style=\"text-align: justify\">Tworz\u0105c mask\u0119 i usuwaj\u0105c pewne sk\u0142adowe o niskich lub wysokich cz\u0119stotliwo\u015bciach mo\u017cemy &#8222;przefiltrowa\u0107&#8221; obraz z pewnych sk\u0142adowych. Filtr dolnoprzepustowy pozwala na uzyskanie efektu rozmycia, natomiast filtr g\u00f3rnoprzepustowy pozwala na wskazanie kraw\u0119dzi w obrazie. Przyk\u0142ad filtru z wykorzystaniem maskowania i usuni\u0119cia pewnych cz\u0119stotliwo\u015bci przedstawiono na listingu 6. Na rysunkach 10 i 11 zaprezentowano przyk\u0142ady obraz\u00f3w oraz wyniki przekszta\u0142ce\u0144 po\u00a0 <strong>filtrze g\u00f3rno i dolno przepustowym<\/strong>.<\/p>\n<p>Listing 6. Program przedstawiaj\u0105cy mo\u017cliwo\u015bci modyfikacji transformaty Fouriera.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('szachy.png',cv2.IMREAD_GRAYSCALE)\r\nimg = cv2.resize(img,(len(img&#x5b;0])\/\/2,len(img)\/\/2))\r\n\r\nrows, cols = img.shape\r\ncrow,ccol = rows\/2 , cols\/2\r\n\r\ndft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)\r\ndft_shift = np.fft.fftshift(dft)\r\n\r\n\r\nmask = np.zeros((rows,cols,2),np.uint8)\r\nmask&#x5b;round(crow)-30:round(crow)+30, round(ccol)-30:round(ccol)+30] = 1\r\n#mask = 1-mask\r\n\r\n\r\nfshift = dft_shift*mask\r\nf_ishift = np.fft.ifftshift(fshift)\r\nimg_back = cv2.idft(f_ishift)\r\nimg_back = cv2.magnitude(img_back&#x5b;:,:,0],img_back&#x5b;:,:,1])\r\n\r\nplt.subplot(121),plt.imshow(img, cmap = 'gray')\r\nplt.title('Input Image'), plt.xticks(&#x5b;]), plt.yticks(&#x5b;])\r\nplt.subplot(122),plt.imshow(img_back, cmap = 'gray')\r\nplt.title('Output Image'), plt.xticks(&#x5b;]), plt.yticks(&#x5b;])\r\nplt.show()\r\n<\/pre>\n<figure id=\"attachment_289\" aria-describedby=\"caption-attachment-289\" style=\"width: 1390px\" class=\"wp-caption alignnone\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft.png\" alt=\"\" class=\"wp-image-289 size-full\" width=\"1390\" height=\"628\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft.png 1390w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft-300x136.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft-1024x463.png 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft-768x347.png 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft-65x29.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft-225x102.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft-350x158.png 350w\" sizes=\"(max-width: 1390px) 100vw, 1390px\" \/><figcaption id=\"caption-attachment-289\" class=\"wp-caption-text\">Rysunek 10.\u00a0 Obraz wej\u015bciowy oraz obraz po filtrze dolnoprzepustowym.<\/figcaption><\/figure>\n<figure id=\"attachment_290\" aria-describedby=\"caption-attachment-290\" style=\"width: 1256px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2.png\" alt=\"\" class=\"wp-image-290 size-full\" width=\"1256\" height=\"565\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2.png 1256w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2-300x135.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2-1024x461.png 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2-768x345.png 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2-65x29.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2-225x101.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/idft2-350x157.png 350w\" sizes=\"(max-width: 1256px) 100vw, 1256px\" \/><figcaption id=\"caption-attachment-290\" class=\"wp-caption-text\">Rysunek 11. Obraz wej\u015bciowy oraz obraz po filtrze g\u00f3rnoprzepustowym.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">Innym wa\u017cnym zagadnieniem, jest wykrycie prostych kszta\u0142t\u00f3w w obrazie takich jak linia lub okr\u0105g. W takim zadaniu mo\u017cemy wykorzysta\u0107 <strong>transformat\u0119 Hougha<\/strong>. Transformata jest relatywnie szybk\u0105 metod\u0105 wyszukiwania kszta\u0142t\u00f3w. Jednak wymaga przeszukania wszystkich mo\u017cliwych prostych\/okr\u0119g\u00f3w na obrazie. Dla przyk\u0142adu, ka\u017cda prost\u0105 mo\u017cemy przedstawi\u0107 jako jej k\u0105t nachylenia oraz punkt przeci\u0119cia z osi\u0105 wsp\u00f3\u0142rz\u0119dnych. Je\u015bli dla ka\u017cdej mo\u017cliwej prostej, zsumujemy potencjalne punkty niezerowe obrazu le\u017c\u0105ce na tej prostej to mo\u017cemy wykry\u0107 potencjalne linie. W praktyce, aby wykorzysta\u0107 transformat\u0119 nale\u017cy skorzysta\u0107 z gotowych funkcji do detekcji linii HoughLines() oraz HoughCircles(). W trakcie znalezienia potencjalnych kszta\u0142t\u00f3w kluczowe s\u0105 parametry wej\u015bciowe funkcji. Przed transformat\u0105 Hougha stosuje si\u0119 najcz\u0119\u015bciej wykrycie kraw\u0119dzi. Na listingu 7 zaprezentowano program wykrywaj\u0105cy linie. Na rysunku 12 zaprezentowano po\u015bredni etap wykrycia linii- obraz po wykryciu kraw\u0119dzi. Na rysunku 13 zaprezentowano obraz z wykrytymi liniami.<\/p>\n<p>Lisnting 7. Program wykrywaj\u0105cy linie z wykorzystaniem transformaty Hougha.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport cv2\r\nimport numpy as np\r\n\r\ndave = cv2.imread('szachownica.png')\r\ndave1 = cv2.cvtColor(dave,cv2.COLOR_BGR2GRAY)\r\ndave2 = cv2.Canny(dave1,100,200,apertureSize = 3)\r\n\r\ncv2.imshow('image',dave2)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\nlines = cv2.HoughLines(dave2,1,np.pi\/20,500)\r\n\r\nfor linea in lines:\r\n   for rho,theta in linea:\r\n      a = np.cos(theta)\r\n      b = np.sin(theta)\r\n      x0 = a*rho\r\n      y0 = b*rho\r\n      x1 = int(x0 + 1000*(-b))\r\n      y1 = int(y0 + 1000*(a))\r\n      x2 = int(x0 - 1000*(-b))\r\n      y2 = int(y0 - 1000*(a))\r\n\r\n    cv2.line(dave,(x1,y1),(x2,y2),(0,0,255),3)\r\n\r\ncv2.imshow('image',dave)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<figure id=\"attachment_296\" aria-describedby=\"caption-attachment-296\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini_canny.jpg\" alt=\"\" class=\"wp-image-296 size-full\" width=\"640\" height=\"640\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini_canny.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini_canny-300x300.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini_canny-150x150.jpg 150w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini_canny-65x65.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini_canny-225x225.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini_canny-350x350.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-296\" class=\"wp-caption-text\">Rysunek 12. Obraz po zastosowaniu wykrywania kraw\u0119dzi.<\/figcaption><\/figure>\n<figure id=\"attachment_295\" aria-describedby=\"caption-attachment-295\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini.jpg\" alt=\"\" class=\"wp-image-295 size-full\" width=\"640\" height=\"640\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini-300x300.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini-150x150.jpg 150w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini-65x65.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini-225x225.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcja_lini-350x350.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-295\" class=\"wp-caption-text\">Rysunek 13. Obraz po wykryciu kraw\u0119dzi.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">Aby wykona\u0107 detekcj\u0119 okr\u0119g\u00f3w nale\u017cy wykorzysta\u0107 funkcj\u0119 HoughCircles(). Zamiast wykrycia kraw\u0119dzi mo\u017cemy zastosowa\u0107 filtr rozmycia. Przyk\u0142ad wykrycia okr\u0119g\u00f3w na obrazie zaprezentowano na listingu 8. Obraz wej\u015bciowy na kt\u00f3rym chcemy dokona\u0107 detekcji zaprezentowano na rysunku 14. Na rysunku 15 zaprezentowano wykryte okr\u0119gi. Aby wykry\u0107 okr\u0119gi kluczowe s\u0105 parametry detekcji param1=150, param2=130, minRadius=50, maxRadius=500. Zmieniaj\u0105c parametry mo\u017cemy zaw\u0119zi\u0107 lub rozszerzy\u0107 zakres poszukiwanych obiekt\u00f3w.<\/p>\n<p>&nbsp;<\/p>\n<p>Listing 8. Program prezentuj\u0105cy wykrycie okr\u0119g\u00f3w na obrazie.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nimg = cv2.imread('rower_a.png',0)\r\nimg = cv2.medianBlur(img,5)\r\ncimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)\r\n\r\ncv2.imshow('detected circles',img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncircles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,200,\r\nparam1=150,param2=130,minRadius=50,maxRadius=500)\r\n\r\ncircles = np.uint16(np.around(circles))\r\nfor i in circles&#x5b;0,:]:\r\ncv2.circle(cimg,(i&#x5b;0],i&#x5b;1]),i&#x5b;2],(0,255,0),2)\r\ncv2.circle(cimg,(i&#x5b;0],i&#x5b;1]),2,(0,0,255),3)\r\n\r\ncv2.imshow('detected circles',cimg)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\ncv2.imwrite('wynik_detekcji.png',cimg)\r\n\r\n<\/pre>\n<figure id=\"attachment_298\" aria-describedby=\"caption-attachment-298\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/rower_a.png\" alt=\"\" class=\"wp-image-298 size-full\" width=\"640\" height=\"450\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/rower_a.png 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/rower_a-300x211.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/rower_a-65x46.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/rower_a-225x158.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/rower_a-350x246.png 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-298\" class=\"wp-caption-text\">Rysunek 14. Obraz na kt\u00f3rym pr\u00f3bujemy wykry\u0107 okr\u0119gi.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_299\" aria-describedby=\"caption-attachment-299\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji.png\" alt=\"\" class=\"wp-image-299 size-full\" width=\"640\" height=\"450\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji.png 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-300x211.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-65x46.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-225x158.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-350x246.png 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-299\" class=\"wp-caption-text\">Rysunek 15. Obraz prezentuj\u0105cy wykryte okr\u0119gi.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p><strong>Zadanie 1.<\/strong><\/p>\n<p style=\"text-align: justify\">Dla obrazu zaprezentowanego na Rysunku 1 przedstawiaj\u0105cego uk\u0142adanie kostki Rubicka, prosz\u0119 wykry\u0107 kolor czerwony a nast\u0119pnie kolor zielony. Prosz\u0119 zmodyfikowa\u0107 program tak, aby zapisywa\u0142 w pliku graficznym mask\u0119 wykrytego koloru.<\/p>\n<p><strong>Odpowied\u017a 1.<\/strong><\/p>\n<p style=\"text-align: justify\">Nale\u017cy zmodyfikowa\u0107 fragment programu zaprezentowanego na listingu 2. Modyfikacji nale\u017cy dokona\u0107 zaprezentowanych poni\u017cej. Aby u\u0142atwi\u0107 dob\u00f3r zakresu parametr\u00f3w kolor\u00f3w w przestrzeni HSV mo\u017cna u\u017cy\u0107 og\u00f3lnodost\u0119pnego kalkulatora\/konwertera przestrzeni barw (https:\/\/www.rapidtables.com\/convert\/color\/rgb-to-hsv.html https:\/\/www.peko-step.com\/en\/tool\/hsvrgb_en.html).<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nlower_blue = np.array(&#x5b;100,50,50])\r\nupper_blue = np.array(&#x5b;240,255,255])\r\nmask = cv2.inRange(hsv, lower_blue, upper_blue)\r\nres = cv2.bitwise_and(frame,frame, mask= mask)\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Zadanie 2.<\/strong><\/p>\n<p>Prosz\u0119 wyznaczy\u0107 histogramy dla kilku obraz\u00f3w: krajobrazu, znaku graficznego, fotografii prezentuj\u0105cej twarz, znak drogowy. Nale\u017cy zaprezentowa\u0107 histogramy dla obrazu o odcieniach szaro\u015bci oraz histogramu dla kolejnych sk\u0142adowych BGR.<\/p>\n<p><strong>Odpowied\u017a 2.<\/strong><\/p>\n<p>Program obliczaj\u0105cy histogramy zaprezentowano na listingu poni\u017cej.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv2.imread('obraz_wejsciowy.jpg',0)\r\n\r\ncv2.imshow('obraz',img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\nplt.hist(img.ravel(),256,&#x5b;0,256]); plt.show()\r\n\r\nimg = cv2.imread('kostka_rubicka.jpg')\r\ncolor = ('b','g','r')\r\nfor i,col in enumerate(color):\r\n   histr = cv2.calcHist(&#x5b;img],&#x5b;i],None,&#x5b;256],&#x5b;0,256])\r\n   plt.plot(histr,color = col)\r\n   plt.xlim(&#x5b;0,256])\r\n   plt.show()\r\n\r\n<\/pre>\n<p><strong>Zadanie 3.<\/strong><\/p>\n<p>Prosz\u0119 zaimplementowa\u0107 program wyszukuj\u0105cy bia\u0142e pionki na szachwonicy. Jako obraz wej\u015bciowy prosz\u0119 zastosowac obraz szachownicy z Rysunku 7.<\/p>\n<p><strong>Odpowied\u017a 3.<\/strong><\/p>\n<p>Nale\u017cy stworzy\u0107 wzorzec prezentuj\u0105cy fragment obrazu zawieraj\u0105cy bia\u0142y pionek. Nast\u0119pnie nale\u017cy wykorzysta\u0107 program zaprezentowany na listingu 4.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Zadanie 4.<\/strong><\/p>\n<p style=\"text-align: justify\">Prosz\u0119 zaimplementowa\u0107 program oraz dostosowa\u0107 parametry w celu wykrycia linii na obrazach przedstawiaj\u0105cych: drog\u0119 wraz z pasami ruchu, znak graficzny zawieraj\u0105cy linie.<\/p>\n<p><strong>Odpowied\u017a 4.<\/strong><\/p>\n<p>Nale\u017cy zmodyfikowa\u0107 program na listingu poni\u017cej. Nale\u017cy dobra\u0107 parametry funkcji HoughLines().<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport cv2\r\nimport numpy as np\r\n\r\ndave = cv2.imread('grafika.png')\r\ndave1 = cv2.cvtColor(dave,cv2.COLOR_BGR2GRAY)\r\ndave2 = cv2.Canny(dave1,100,200,apertureSize = 3)\r\n\r\ncv2.imshow('image',dave2)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\nlines = cv2.HoughLines(dave2,1,np.pi\/20,500)\r\n\r\nfor linea in lines:\r\n   for rho,theta in linea:\r\n      a = np.cos(theta)\r\n      b = np.sin(theta)\r\n      x0 = a*rho\r\n      y0 = b*rho\r\n      x1 = int(x0 + 1000*(-b))\r\n      y1 = int(y0 + 1000*(a))\r\n      x2 = int(x0 - 1000*(-b))\r\n      y2 = int(y0 - 1000*(a))\r\n\r\n      cv2.line(dave,(x1,y1),(x2,y2),(0,0,255),3)\r\n\r\ncv2.imshow('image',dave)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Zadanie 5.<\/strong><\/p>\n<p>Prosz\u0119 zaimplementowa\u0107 program oraz dostosowa\u0107 parametry w celu wykrycia okr\u0119g\u00f3w na obrazach przedstawiaj\u0105cych: monety, \u017arenic\u0119 oka, grafik\u0119 zawieraj\u0105c\u0105 okr\u0119gi o r\u00f3\u017cnej \u015brednicy i kolorze .<\/p>\n<p><strong>Odpowied\u017a 5.<\/strong><\/p>\n<p>Nale\u017cy zmodyfikowa\u0107 program na listingu poni\u017cej. Nale\u017cy dobra\u0107 parametry funkcji HoughCircles().<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nimg = cv2.imread('rower_a.png',0)\r\nimg = cv2.medianBlur(img,5)\r\ncimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)\r\n\r\ncv2.imshow('detected circles',img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncircles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,200,\r\nparam1=150,param2=130,minRadius=50,maxRadius=500)\r\n\r\ncircles = np.uint16(np.around(circles))\r\nfor i in circles&#x5b;0,:]:\r\n\r\ncv2.circle(cimg,(i&#x5b;0],i&#x5b;1]),i&#x5b;2],(0,255,0),2)\r\n\r\ncv2.circle(cimg,(i&#x5b;0],i&#x5b;1]),2,(0,0,255),3)\r\n\r\ncv2.imshow('detected circles',cimg)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\ncv2.imwrite('wynik_detekcji.png',cimg)\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"author":49,"menu_order":4,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"part":3,"_links":{"self":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/115"}],"collection":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/users\/49"}],"version-history":[{"count":58,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/115\/revisions"}],"predecessor-version":[{"id":506,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/115\/revisions\/506"}],"part":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/parts\/3"}],"metadata":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/115\/metadata\/"}],"wp:attachment":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/media?parent=115"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapter-type?post=115"},{"taxonomy":"contributor","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/contributor?post=115"},{"taxonomy":"license","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/license?post=115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}