- 1. Mga Pagbabago ng Imahe - Pagbabago ng Affine at Non-Affine
- 2. Mga Pagsasalin sa Imahe - Paglipat ng imahe pataas, pababa, kaliwa at kanan
- 3. Pag-ikot ng imahe - Umiikot na imahe
- 4. Pagsukat, Pagbabago ng laki at Interpolasyon
- 5. Mga Pyramid ng Larawan - Isa pang paraan ng pagbabago ng laki
- 6. Pag-crop - Pagputol ng rehiyon ng imahe na gusto mo
- 7. Ang mga pagpapatakbo ng Arithmetic para sa Brightening at Darkening ng mga imahe
Sa nakaraang tutorial, natutunan namin ang tungkol sa OpenCV at nagawa ang ilang pangunahing pagproseso ng imahe gamit ito tulad ng grey scaling, saturation ng kulay, histogram, mga puwang ng kulay, bahagi ng RGB atbp Tulad ng sinabi sa nakaraang tutorial, ang OpenCV ay Open Source Commuter Vision Library na mayroong Ang C ++, Python at Java interface at sumusuporta sa Windows, Linux, Mac OS, iOS at Android. Kaya madali itong mai-install sa Raspberry Pi na may kapaligiran sa Python at Linux. At ang Raspberry Pi na may OpenCV at naka-attach na camera ay maaaring magamit upang lumikha ng maraming mga application ng pagproseso ng imahe ng real-time tulad ng Pagtuklas ng mukha, lock ng mukha, pagsubaybay sa object, pagtuklas ng plate ng numero ng kotse, system ng seguridad ng tahanan atbp.
Sa tutorial na ito, makikita natin kung paano namin manipulahin ang imahe gamit ang OpenCV. Malalaman natin dito na ilapat ang sumusunod na pagpapaandar sa isang imahe gamit ang OpenCV:
- Mga Pagbabago ng Imahe - Pagbabago ng Affine at Non-Affine
- Mga Pagsasalin sa Imahe - Paglipat ng imahe pataas, pababa, kaliwa at kanan
- Pag-ikot ng imahe - Umiikot na imahe
- Pag-scale, Pagbabago ng laki, at Pag-iisa
- Mga Pyramid ng Larawan - Isa pang paraan ng pagbabago ng laki
- Pag-crop - Pagputol ng rehiyon ng imahe na gusto mo
- Ang mga pagpapatakbo ng Arithmetic para sa Brightening at Darkening ng mga imahe
1. Mga Pagbabago ng Imahe - Pagbabago ng Affine at Non-Affine
Ang mga pagbabago ay mga pang-geometric na pagbaluktot na naisabatay sa isang imahe, tiyak na mga pagbaluktot dito ay hindi nangangahulugang mga pagkakamali ngunit isang uri ng pagwawasto upang maitama ang mga isyung pananaw na nagmumula sa puntong nakuha ang imahe. Mayroong dalawang Uri ng mga pagbabago sa imahe - Affine at Non-Affine
Ang mga affine transformation ay may tatlong uri ng pag-scale, pag-ikot at pagsasalin, ang mahalagang bagay sa mga affine transformation ay ang mga linya ay kahanay bago at pagkatapos ng mga pagbabago sa imahe.
Ang mga transformation na hindi pang -Affine o mga pagbabago sa projective ay hindi nag-iingat ng parallelism, haba o anggulo, pinapanatili nito ang collinearity at incidence, ibig sabihin ng collinearity na ang dalawang puntos ay namamalagi sa parehong tuwid na linya.
Ang mga hindi pagbabago na Affine ay pangkaraniwan sa paningin ng computer at nabuo mula sa iba't ibang mga anggulo ng camera. Ang mga pagbabagong hindi pang-affine o projective ay tinatawag ding homography.
2. Mga Pagsasalin sa Imahe - Paglipat ng imahe pataas, pababa, kaliwa at kanan
Ang paglilipat ng imahe ay gumagalaw ng imahe pataas, pababa, kaliwa at kanan at kahit pahilis kung ipinatupad namin ang pagsasaling-sama ng x at y nang sabay.
Ngayon para sa pagsasagawa ng mga pagsasalin ng imahe ginagamit namin ang function ng warpAffine ng opencv, cv2.warpAffine ay ginagamit upang ipatupad ang mga salin na ito ngunit kailangan namin iyon ng isang matrix ng pagsasalin.
Matriks ng pagsasalin, T = 1 0 Tx
0 1 ty
T X, T y ang mga direksyon kung saan nagaganap ang paglilipat ng imahe.
Kung saan ang T X ay lumilipat kasama ang X-axis (Pahalang)
Ang T Y ay lumilipat kasama ang Y-axis (Vertical)
# ito ay isang affine transformation na simpleng nagpapalipat-lipat sa posisyon ng isang imahe # ginagamit namin ang cv2.warpAffine upang ipatupad ang mga pagbabagong ito. import cv2 import numpy as np image = cv2.imread ('input.jpg') # itago ang taas at lapad ng taas ng imahe , lapad = image.shape print (image.shape) quater_height, quater_width = taas / 4, lapad / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (imahe, T, (lapad, taas)) print (T) cv2.imshow ('original_image', imahe) cv2.waitKey (0) cv2.imshow (' Pagsasalin ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Output ng Console - (183, 275) - taas at lapad
- T matrix
]
3. Pag-ikot ng imahe - Umiikot na imahe
Ang pag-ikot ng imahe ay umiikot ng isang imahe tungkol sa isang punto o sa puntong nasa gitna ng imahe, tulad ng paggalaw ng point na gumaganap tulad ng isang pivot.
Tulad ng sa pagsasalin mayroon kaming T matrix, malamang sa pag-ikot mayroon kaming M matrix
Rotation matrix, M matrix = Cosθ -Sinθ
Sinθ Cosθ
Kung saan ang θ ay angulo ng pag-ikot, sinusukat sa anti-clockwise na direksyon.
Gayundin mayroong isang bagay na dapat tandaan na pinapayagan ka ng OpenCV na ibenta at paikutin ang imahe nang sabay-sabay gamit ang pagpapaandar, cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, anggulo ng pag-ikot, sukat)
Gumagamit pa rin kami ng function ng warpAffine ng opencv upang makuha ang pag-ikot ng imahe ngunit sa halip na translation matrix tulad ng sa dating kaso dito ginagamit namin ang rotation matrix.
i-import ang cv2 import numpy bilang np image = cv2.imread ('input.jpg') taas, lapad = image.shape #bahagi ang taas at lapad ng 2 upang paikutin ang imahe tungkol sa center rotation_matrix = cv2.getRotationMatrix2D ((width / 2, taas / 2), 90,1) rotated_image = cv2.warpAffine (imahe, pag-ikot_matrix, (lapad, taas)) cv2.imshow ('orihinal na imahe', imahe) cv2.waitKey (0) cv2.imshow ('paikot na imahe ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Ngayon ang imahe ay pinaikot ng 90 degree, ito ay na-crop dahil sa laki ng canvas, dahil ang laki ng canvas ay nananatiling pareho ngunit dahil sa laki ng imahe ng pag-ikot ay hindi umaangkop sa laki ng canvas. Maaari itong ayusin sa pamamagitan ng pagtatakda ng scaling factor sa negatibo, ngunit pinapayagan nito ang isang itim na background sa likod ng imahe.
Kaya't maitatakda mo ang taas at lapad ng imahe sa pamamagitan ng pag-asa sa ito o paghula o mayroong ibang paraan ng pag-ikot ng imahe sa pamamagitan ng paglipat nito, ngunit paikutin nito ang imahe ng mga multiply ng 90 degree sa anti-clockwise na direksyon.
4. Pagsukat, Pagbabago ng laki at Interpolasyon
Ang pag-scale at pagbabago ng laki ay mga affine transformation, ang pagbabago ng laki ng imahe ay aming nagawa nang medyo matagal at nakipag-usap din kami sa interpolation, tulad ng pag-resize mo sa laki ng imahe sa mas malaking sukat kung saan namin pinalalawak ang mga pixel, may ilang mga puwang sa mga pixel at doon pumapasok ang interpolation.
Maaari itong maganap sa pagdaragdag ng laki ng imahe mula sa mas maliit hanggang sa mas malaki o nababawasan ang laki ng imahe mula sa mas malaki hanggang sa mas maliit.
Sa teknikal na paraan, ang interpolation ay isang pamamaraan ng pagbuo ng mga bagong puntos ng data (pixel), sa loob ng discrete na hanay ng mga kilalang puntos ng data.
Mayroong iba't ibang mga uri ng mga interpolation na pamamaraan sa OpenCV tulad ng
cv2.INTER_AREA - mabuti para sa pag-urong o pababa ng sampling
cv2.INTER_NEAREST - pinakamabilis
cv2.LINEAR - mabuti para sa pag-zoom o pag-up ng sample (default)
cv2.CUBIC - mas mabuti
cv2.INTER_LANCZOS4 - pinakamahusay
Napakadali ng # resizing gamit ang pagpapaandar ng cv2.resize, ang mga argumento ay # cv2.resize (imahe, dsize (laki ng output ng imahe), x_scale, y_scale, interpolation) import cv2 import numpy bilang np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', imahe) cv2.waitKey (0) # gawin natin ang imahe 3/4 ang orihinal na laki ng imahe ie kaliskis pababa sa 75% image_scaled = cv2.resize (imahe, Wala, fx = 0.75, fy = 0.75) #since linear interpolation ay default na pamamaraan para sa bukas na cv hindi namin kailangan na ipatupad ito bilang isang pagpapaandar. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # doblehin natin ang laki ng aming imahe img_double = cv2.resize (imahe, Wala, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # gawin natin ang pagbabago ng laki ng mga eksaktong sukat na image_resize = cv2.resize (imahe, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Mga Pyramid ng Larawan - Isa pang paraan ng pagbabago ng laki
Ang Pyramiding na imahe ay tumutukoy sa alinman sa pag-upcaling (pagpapalaki ng mga imahe) o downscaling (pag-urong ng mga imahe).
Ito ay isang iba't ibang paraan lamang ng pagbabago ng laki na nagbibigay-daan sa amin upang madali at mabilis na masukat ang mga imahe, i-scale pababa ang pagbawas ng taas at lapad ng bagong imahe nang kalahati.
Ito ay kapaki-pakinabang kapag gumagawa ng mga detektor ng bagay na sumusukat sa mga imahe tuwing naghahanap ito ng isang bagay.
import cv2 image = cv2.imread ('input.jpg') mas maliit = cv2.pyrDown (imahe) mas malaki = cv2.pyrUp (mas maliit) cv2.imshow ('orihinal', imahe) cv2.waitKey (0) cv2.imshow ('mas maliit', mas maliit) cv2.waitKey (0) cv2.imshow ('mas malaki', mas malaki) cv2.waitKey (0) cv2.destroyAllWindows ()
Sa mas malaking imahe mapapansin mo na ang pagkakaroon ng parehong sukat ng orihinal na imahe ay maliit na malabo dahil na-convert ito mula sa mas maliit na imahe patungo sa mas malaking imahe nang direkta. Ngunit kung interpolate namin ito, ang kalidad ng imahe ay magiging mas mahusay tulad ng nakaraang isa dahil tinantya ng interpolation ang mga pixel habang pinupunan ang mga puwang kapag ang imahe ay pinalaki.
Ang pagpapatakbo ngayon ng parehong code ngunit may interpolasyon ng kubiko ay nagbibigay ng isang mas mahusay na kalidad ng malaking imahe. Ipinapakita ng mga imahe sa ibaba ang paghahambing sa orihinal na imahe, pataas na naka-scale na bersyon ng imahe, mas maliit na imahe at cubic interpolated na bersyon ng mas maliit na imahe.
i-import ang cv2 na imahe = cv2.imread ('input.jpg') mas maliit = cv2.pyrDown (imahe) mas malaki = cv2.pyrUp (mas maliit) cv2.imshow ('orihinal', imahe) cv2.waitKey (0) cv2.imshow ('maliit', mas maliit) cv2.waitKey (0) cv2.imshow ('mas malaki', mas malaki) cv2.waitKey (0) # pagtaas ng kalidad ng na-convert na mas malaking imahe mula sa mas maliit na imahe gamit ang cubic interpolation img_double = cv2.resize (mas maliit, Wala, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
TANDAAN: Kung nais mong lumikha ng maraming maliliit na kopya ng mga imahe na magiging mas maliit at mas maliit sa laki o maraming malalaking kopya ng mga imahe na patuloy na lumalaki sa laki, maaari naming gamitin para sa mga loop o habang ang mga loop ay pinapanatili sa loob ng pag -andar ng pyrDown o pyrUp .
6. Pag-crop - Pagputol ng rehiyon ng imahe na gusto mo
Ang pag-crop ng mga imahe ay tumutukoy sa pagkuha ng isang segment ng imahe.
Ang OpenCV nang direkta ay walang cropping function ngunit madali itong magagawa sa pamamagitan ng numpy gamit ang code sa ibaba
Tinadtad = imahe
Inilalagay namin ang array ng imahe at gumagamit ng mga tool sa pag-index o pamamaraan sa numpy, tinutukoy namin ang hilera ng pagsisimula sa pagtatapos ng hilera at simulan ang haligi sa pagtatapos ng haligi na pinaghihiwalay ng isang kuwit na kumukuha ng rektanggulo na nais naming i-crop upang makuha ang imahe.
i-import ang cv2 import numpy bilang np image = cv2.imread ('input.jpg') taas, lapad = image.shape # kunin natin ang pagsisimula ng mga coordinate ng pixel (itaas na kaliwa ng cropping rektanggulo) start_row, start_col = int (taas *.25), int (lapad *.25) # kunin natin ang pagtatapos ng mga coordinate ng pixel (kanang bahagi sa ibaba) end_row, end_col = int (taas *.75), int (lapad *.75) #simply use indexing upang i-crop ang rektanggulo na nais naming ma- crop = imahe cv2.imshow ("orihinal na imahe", imahe) cv2.waitKey (0) cv2.imshow ("na-crop na imahe", na-crop) cv2.waitKey (0) cv2.destroyAllWindows ()
Tandaan na maaari mong gamitin ang mga halaga ng pixel nang direkta sa halip na start_col o start_row , ibinigay lamang ang mga ito upang makuha ang madaling pagkakakilanlan para sa gumagamit.
7. Ang mga pagpapatakbo ng Arithmetic para sa Brightening at Darkening ng mga imahe
Ang mga pagpapatakbo ng aritmetika sa OpenCV ay karaniwang nagdaragdag o nagbabawas ng mga matrix sa imahe, ang pagdaragdag o pagbabawas ng mga matrix ay may epekto sa pagtaas o pagbawas ng ningning.
Kaya upang magdagdag o magbawas ng mga matrix na kailangan namin upang likhain ang mga ito at ang numpy ay may isang pagpapaandar na tinatawag bilang mga np.ones na nagbibigay sa mga matrix ng parehong laki ng 1 ng aming imahe.
i-import ang cv2 import numpy bilang np image = cv2.imread ('input.jpg') #gumawa ng isang matrix ng isa, pagkatapos ay i-multiply ito sa pamamagitan ng isang scaler ng 100 ' # np.ones ay nagbibigay ng isang matrix na may parehong sukat ng aming imahe sa lahat ang mga halagang 100 sa kasong ito M = np.ones (image.shape, dtype = "uint8") * 100 #Ginagamit namin ito upang idagdag ang matrix M na ito sa aming imahe #pansinin ang pagtaas ng idinagdag na ilaw = cv2.add (imahe, M) cv2.imshow ("Naidagdag", naidagdag) cv2.waitKey (0) #likelike maaari din nating ibawas ang #napansin ang pagbawas ng ilaw na binawas = cv2.subtract (imahe, M) cv2.imshow ("binawas", binawas) cv2.waitKey (0) cv2.destroyAllWindows ()
Ito ay kung paano magagamit ang OpenCV upang mag-apply ng maraming iba't ibang mga pagpapatakbo ng pagproseso ng imahe sa imahe. Magpatuloy kami sa iba pang mga pagpapaandar ng pagmamanipula ng imahe sa susunod na tutorial.