- 1. Vaizdų transformacijos - afinų ir ne afinų transformacijos
- 2. Vaizdų vertimai - judantis vaizdas aukštyn, žemyn, kairėn ir dešinėn
- 3. Vaizdo pasukimas - vaizdo sukimas
- 4. Mastelio keitimas, dydžio keitimas ir interpoliacija
- 5. Vaizdo piramidės - dar vienas būdas pakeisti dydį
- 6. Apkarpymas - norimo vaizdo srities iškirpimas
- 7. Vaizdų ryškinimo ir tamsinimo aritmetinės operacijos
Ankstesnėje pamokoje mes sužinojome apie „OpenCV“ ir atlikome keletą pagrindinių vaizdų apdorojimo būdų, pvz., Pilkos spalvos mastelį, spalvų sodrumą, histogramą, spalvų erdves, RGB komponentą ir kt. Kaip pasakyta ankstesnėje pamokoje, „ OpenCV“ yra „Open Source Commuter Vision Library “ C ++, Python ir Java sąsajos ir palaiko Windows, Linux, Mac OS, iOS ir Android. Taigi jį galima lengvai įdiegti į „Raspberry Pi“ su „Python“ ir „Linux“ aplinka. „Raspberry Pi“ su „OpenCV“ ir prijungta kamera gali būti naudojama kuriant daugybę realaus laiko vaizdo apdorojimo programų, tokių kaip veido aptikimas, veido užraktas, objektų sekimas, automobilio numerių aptikimas, namų apsaugos sistema ir kt.
Šioje pamokoje pamatysime, kaip mes manipuliuosime vaizdu naudodami „OpenCV“. Čia mes išmoksime naudoti šią funkciją paveikslėlyje naudodami „OpenCV“:
- Vaizdo transformacijos - afininis ir ne afininis transformavimas
- Vaizdų vertimai - judantis vaizdas aukštyn, žemyn, kairėn ir dešinėn
- Vaizdo pasukimas - vaizdo sukimas
- Mastelio keitimas, dydžio keitimas ir interpoliacija
- Vaizdo piramidės - dar vienas būdas pakeisti dydį
- Apkirpimas - iškirpkite norimą vaizdo sritį
- Vaizdų ryškinimo ir tamsinimo aritmetinės operacijos
1. Vaizdų transformacijos - afinų ir ne afinų transformacijos
Transformacijos yra geometriniai iškraipymai, paveikti vaizdą, iškraipymai čia tikrai reiškia ne klaidas, o pataisų tipą, siekiant ištaisyti perspektyvos problemas, kylančias iš taško, kuriame vaizdas buvo užfiksuotas. Vaizdo transformacijos yra dviejų tipų - Affine ir Non Affine
Afinų transformacijos yra trijų rūšių mastelio keitimas, sukimas ir vertimas. Afininių transformacijų metu svarbu tai, kad linijos yra lygiagrečios prieš ir po vaizdo transformacijų.
Ne afininės transformacijos ar projekcinės transformacijos neišsaugo lygiagretumo, ilgio ar kampo, tačiau išsaugo kolinearumą ir paplitimą, kolinearumas reiškia, kad du taškai yra vienoje tiesėje.
Ne afininės transformacijos yra labai paplitusios kompiuterio regėjime ir yra generuojamos iš skirtingų kameros kampų. Nefininės ar projekcinės transformacijos dar vadinamos homografija.
2. Vaizdų vertimai - judantis vaizdas aukštyn, žemyn, kairėn ir dešinėn
Vaizdo vertimas vaizdą juda aukštyn, žemyn, kairėn ir dešinėn ir netgi įstrižai, jei vienu metu įgyvendiname x ir y vertimą.
Dabar atlikti vaizdo vertimus mes naudojame OpenCV anketa warpAffine funkciją, cv2.warpAffine naudojamas įgyvendinti šiuos vertimus, bet kad mums reikia vertimo matrica.
Vertimo matrica, T = 1 0 Tx
0 1 ty
T X, T y yra kryptys, kuriomis vyksta vaizdo poslinkis.
Kur T X poslinkis išilgai X ašies (horizontalus)
T Y yra poslinkis išilgai Y ašies (vertikalus)
# tai yra afininė transformacija, kuri tiesiog pakeičia vaizdo padėtį. # Mes naudojame cv2.warpAffine, kad įgyvendintume šias transformacijas. importuoti cv2 importuoti numerį kaip np image = cv2.imread ('input.jpg') # išsaugoti vaizdo aukščio aukštį ir plotį , plotį = image.shape spausdinti (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (paveikslėlis, T, (plotis, aukštis)) spausdinimas (T) cv2.imshow ('originalus_vaizdas', vaizdas) cv2.waitKey (0) cv2.imshow (' Vertimas ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsolės išvestis - (183, 275) - aukštis ir plotis
- T matrica
]
3. Vaizdo pasukimas - vaizdo sukimas
Vaizdo pasukimas yra vaizdo pasukimas apie tašką arba tašką, esantį vaizdo centre, lygiai taip pat, kaip sukamasis taškas veikia kaip pasisukimas.
Kaip ir vertime, mes turime T matricą, greičiausiai sukimosi metu mes turime M matricą
Sukimosi matrica, M matrica = Cosθ -Sinθ
Sinθ Cosθ
Kur θ yra sukimosi kampas, matuojamas prieš laikrodžio rodyklę.
Taip pat reikia atkreipti dėmesį į tai, kad „OpenCV“ leidžia parduoti ir pasukti vaizdą tuo pačiu metu naudojant funkciją cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, rotation angle, scale)
Mes vis dar naudojame „opencv“ funkciją „warpAffine“, kad gautume vaizdo pasukimą, tačiau vietoj vertimo matricos, kaip ir ankstesniame atveju, mes naudojame sukimosi matricą.
importo CV2 importo numpy kaip np vaizdą = cv2.imread ("input.jpg ') aukštis, plotis = image.shape #divide aukščio ir pločio nuo 2 iki pasukti atvaizdą apie tai centro rotation_matrix = cv2.getRotationMatrix2D ((plotis / 2, height / 2), 90,1) rotated_image = cv2.warpAffine (image, rotation_matrix, (width, height)) cv2.imshow ('original image, image) cv2.waitKey (0) cv2.imshow (' pasuktas vaizdas ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Dabar vaizdas pasuktas 90 laipsnių kampu, jis yra apkarpytas dėl drobės dydžio, nes drobės dydis išlieka toks pats, tačiau dėl pasukimo vaizdo dydis netelpa į drobės dydį. Ją galima sureguliuoti nustatant neigiamą mastelio koeficientą, tačiau jis leidžia juodą foną už vaizdo.
Taigi galite nustatyti vaizdo aukštį ir plotį, numatydami jį ar atspėdami, arba yra kitas vaizdo pasukimo būdas - perkėlimas, tačiau jis pasuktų 90 laipsnių kartotėmis prieš laikrodžio rodyklę.
4. Mastelio keitimas, dydžio keitimas ir interpoliacija
Mastelio keitimas ir dydžio keitimas yra afiniškos transformacijos, vaizdo dydžio keitimas yra tai, ką mes padarėme gana ilgai, ir mes taip pat susidūrėme su interpoliacija, pavyzdžiui, kai jūs keičiate vaizdo dydį į didesnį dydį, kuriame mes plečiame taškus, yra keletas spragų pikselių ir čia atsiranda interpoliacija.
Tai gali atsitikti didinant vaizdo dydį iš mažesnio į didesnį arba mažinant vaizdo dydį iš didesnio į mažesnį.
Techniškai interpoliacija yra naujų duomenų taškų (taškų) konstravimo metodas atskirame žinomų duomenų taškų rinkinyje.
„OpenCV“ yra įvairių tipų interpoliacijos metodų
cv2.INTER_AREA - gerai, jei norite sumažinti arba sumažinti mėginius
cv2.INTER_NEAREST - greičiausias
cv2.LINEAR - tinka priartinti arba padidinti imtį (numatytasis)
cv2.CUBIC - geresnis
cv2.INTER_LANCZOS4 - geriausias
# dydžio keitimas yra labai paprastas naudojant funkciją cv2.resize, jos argumentai yra # cv2.resize (vaizdas, dsize (išvesties vaizdo dydis), x_scale, y_scale, interpoliacija) importuoti cv2 import numerį kaip np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # padarykime vaizdą 3/4 originalaus vaizdo dydžio, ty sumažinkime iki 75% image_scaled = cv2.resize (image, None, fx = 0,75, fy = 0,75) #nuo to, kad linijinė interpoliacija yra numatytasis atviros cv metodas, mums nereikia jos įgyvendinti kaip funkcijos. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # padvigubinkime savo vaizdo dydį img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # atliksime dydį tiksliomis matmenimis image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Vaizdo piramidės - dar vienas būdas pakeisti dydį
Piramidinis vaizdas reiškia didinimą (vaizdų didinimas) arba mažinimą (mažėjantys vaizdai).
Tai paprasčiausiai kitoks dydžio keitimo būdas, leidžiantis lengvai ir greitai keisti vaizdus, sumažinant jo dydį, perpus sumažinant naujojo vaizdo aukštį ir plotį.
Tai naudinga gaminant objektų detektorius, kurie kaskart, kai ieško objekto, keičia vaizdus.
importuoti cv2 image = cv2.imread ('input.jpg') mažesnis = cv2.pyrDown (vaizdas) didesnis = cv2.pyrUp (mažesnis) cv2.imshow ('originalus', vaizdas) cv2.waitKey (0) cv2.imshow ("mažesnis", mažesnis) cv2.waitKey (0) cv2.imshow ("didesnis", didesnis) cv2.waitKey (0) cv2.destroyAllWindows ()
Didesniame paveikslėlyje pastebėsite, kad vis tiek yra tokio paties dydžio originalus vaizdas, todėl jis neryškus, nes jis tiesiogiai konvertuojamas iš mažesnio į didesnį. Bet jei mes jį interpoliuosime, vaizdo kokybė pagerės, palyginti su ankstesniu, nes interpoliacija įvertina taškus, tuo pačiu užpildydama tarpus, kai vaizdas padidinamas.
Dabar naudojant tą patį kodą, bet naudojant kubinę interpoliaciją, gaunama geresnė didelio vaizdo kokybė. Žemiau esančiuose paveikslėliuose parodytas palyginimas tarp originalaus atvaizdo, padidintos vaizdo versijos, mažesnio paveikslėlio ir mažesne kubine interpoluota versija.
importuoti cv2 image = cv2.imread ('input.jpg') mažesnis = cv2.pyrDown (vaizdas) didesnis = cv2.pyrUp (mažesnis) cv2.imshow ('originalus', vaizdas) cv2.waitKey (0) cv2.imshow ("mažesnis", mažesnis) cv2.waitKey (0) cv2.imshow ("didesnis", didesnis) cv2.waitKey (0) # didinti konvertuoto didesnio vaizdo kokybę iš mažesnio paveikslėlio naudojant kubinę interpoliaciją img_double = cv2.resize (mažesnis, Nėra, fx = 2, fy = 2, interpoliacija = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
PASTABA: Jei norite sukurti mažoms kopijos vaizdų vyksta mažesni ir mažesni ar keliais dideliais kopijų vaizdų nuolat auga dydžio, tada mes galime naudoti už kilpomis arba o kilpos išlaikyti viduje pyrDown arba pyrUp funkcija.
6. Apkarpymas - norimo vaizdo srities iškirpimas
Vaizdų apkarpymas reiškia vaizdo segmento išskyrimą.
„OpenCV“ tiesiogiai neturi apkarpymo funkcijos, tačiau tai gali lengvai padaryti naudodamas toliau pateiktą kodą naudodamasis numeriu
Apkarpytas = vaizdas
Mes įdėjome vaizdų masyvą ir naudodami indeksavimo įrankius ar metodą numpy, mes nustatome pradžios eilutę iki pabaigos eilutės ir pradžios stulpelį nuo pabaigos iki kolonos, atskirtos kableliu, kuris ištraukia stačiakampį, kurį norime apkarpyti, kad gautume vaizdą.
importuoti cv2 importo numerį kaip np image = cv2.imread ('input.jpg') aukštis, plotis = image.shape # paimkime pradinių taškų koordinates (stačiakampio apkarpymo viršuje kairėje) start_row, start_col = int (aukštis *.25), int (plotis *.25) # gausime pabaigos taškų koordinates (apačioje dešinėje) end_row, end_col = int (aukštis *.75), int (plotis *.75) # paprasčiausiai naudokite indeksavimą, kad iškirptumėte norimą apkarpytą stačiakampį = vaizdas cv2.imshow ("originalus atvaizdas", vaizdas) cv2.waitKey (0) cv2.imshow ("apkarpytas vaizdas", apipjaustytas) cv2.waitKey (0) cv2.destroyAllWindows ()
Atkreipkite dėmesį, kad pikselių reikšmes galite naudoti tiesiai vietoj pradžios_kolos ar pradžios_ eilutės , jos tiesiog pateikiamos norint lengvai identifikuoti vartotoją.
7. Vaizdų ryškinimo ir tamsinimo aritmetinės operacijos
Aritmetinės operacijos „OpenCV“ iš esmės yra matricų pridėjimas ar atimimas prie vaizdo, matricų pridėjimas ar atėmimas turi įtakos ryškumo padidėjimui ar sumažėjimui.
Taigi, norėdami pridėti arba atimti matricas, turime jas sukurti, o numpy turi funkciją, vadinamą np.ones, kuri suteikia matricas, kurių dydis yra tokio pat dydžio, kaip ir mūsų paveikslėlyje.
importuoti cv2 import numerį kaip np image = cv2.imread ('input.jpg') #sukurkite savo matricą, tada padauginkite ją iš skalerio 100 ' # np.ones suteikia matricą, kurios matmenys yra tokie patys kaip ir mūsų vaizdo su visais reikšmės yra 100, šiuo atveju M = np.ones (image.shape, dtype = "uint8") * 100 # mes naudojame tai, kad pridėtume šią matricą M prie savo vaizdo # atkreipkite dėmesį į padidėjusį ryškumą = cv2.add (image, M) cv2.imshow ("Pridėta", pridėta) cv2.waitKey (0) #panašiai taip pat galime atimti #pastebėti, kad atimtas ryškumo sumažėjimas = cv2.subtract (vaizdas, M) cv2.imshow ("atimtas", atimtas) cv2.waitKey (0) cv2.destroyAllWindows ()
Taip „OpenCV“ galima naudoti taikant daugybę skirtingų vaizdo apdorojimo operacijų paveikslėlyje. Kitoje pamokoje tęsime kitas vaizdo manipuliavimo funkcijas.