- 1. Трансформације слике - Афина и Неафинска трансформација
- 2. Преводи слика - Покретање слике горе, доле, лево и десно
- 3. Ротација слике - Окретање слике
- 4. Скалирање, промена величине и интерполација
- 5. Сликовне пирамиде - Још један начин промене величине
- 6. Обрезивање - Исеците област слике коју желите
- 7. Аритметичке операције за осветљавање и затамњење слика
У претходном водичу научили смо о ОпенЦВ-у и извршили неке основне обраде слика користећи га попут скалирања сиве боје, засићења боја, хистограма, простора боја, РГБ компоненте итд. Као што је речено у претходном упутству, ОпенЦВ је Опен Соурце Цоммутер Висион Либрари која има Ц ++, Питхон и Јава интерфејси и подржава Виндовс, Линук, Мац ОС, иОС и Андроид. Тако да се лако може инсталирати у Распберри Пи са Питхон и Линук окружењем. А Распберри Пи са ОпенЦВ и прикљученом камером може се користити за стварање многих апликација за обраду слика у стварном времену попут откривања лица, закључавања лица, праћења предмета, откривања таблица аутомобила, кућног сигурносног система итд.
У овом упутству ћемо видети како ћемо манипулисати сликом користећи ОпенЦВ. Овде ћемо научити да применимо следећу функцију на слику помоћу ОпенЦВ-а:
- Трансформације слике - Афина и Неафинска трансформација
- Преводи слика - Покретање слике горе, доле, лево и десно
- Ротација слике - Окретање слике
- Скалирање, промена величине и интерполација
- Пирамиде слика - Још један начин промене величине
- Исецање - Исеците област слике коју желите
- Аритметичке операције за осветљавање и затамњење слика
1. Трансформације слике - Афина и Неафинска трансформација
Трансформације су геометријска изобличења изведена на слици, изобличења овде сигурно не значе грешке већ тип корекције ради исправљања проблема перспективе који проистичу из тачке на којој је слика снимљена. Постоје две врсте трансформације слике - Аффине и Нон-Аффине
Афине трансформације су три врсте скалирања, ротације и транслације, најважнија ствар у афинским трансформацијама је да су линије паралелне пре и после трансформације слике.
Неафинне трансформације или пројективне трансформације не задржавају паралелизам, дужину или угао, али ипак чувају колинеарност и инциденцу, колинеарност значи да две тачке леже на истој правој линији.
Неафинне трансформације су врло честе у рачунарском виду и генеришу се из различитих углова камере. Неафинне или пројективне трансформације називају се и хомографија.
2. Преводи слика - Покретање слике горе, доле, лево и десно
Превођење слике помера слику горе, доле, лево и десно, па чак и дијагонално ако истовремено примењујемо к и и превод.
Сада за извођење превода слика користимо опенцв-ову функцију варпАффине, цв2.варпАффине се користи за примену ових превода, али за то нам је потребна матрица превода.
Матрица превода, Т = 1 0 Тк
0 1 ти
Т Кс, Т и су правци у којима се слика мења.
При чему је Т Кс помак дуж Кс оси (водоравно)
Т И је помак дуж И осе (вертикално)
# ово је афина трансформација која једноставно помера положај слике # користимо цв2.варпАффине за примену ових трансформација. импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('инпут.јпг') # чува висину и ширину висине слике , видтх = имаге.схапе принт (имаге.схапе) куатер_хеигхт, куатер_видтх = хеигхт / 4, видтх / 4 Т = нп.флоат32 (,]) имг_транслатион = цв2.варпАффине (слика, Т, (ширина, висина)) принт (Т) цв2.имсхов ('оригинал_имаге', слика) цв2.ваитКеи (0) цв2.имсхов (' Превод ', имг_транслатион) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Излаз конзоле - (183, 275) - висина и ширина
- Т матрица
]
3. Ротација слике - Окретање слике
Ротација слике је ротирање слике око тачке или тачке у центру слике, баш као што ротирајућа тачка делује као стожер.
Како у преводу имамо Т матрицу, вероватно у ротацији имамо М матрицу
Матрица ротације, М матрица = Цосθ -Синθ
Синθ Цосθ
Где је θ угао ротације, мерен у смеру супротном од казаљке на сату.
Такође постоји једна ствар коју треба приметити да вам ОпенЦВ омогућава продају и ротирање слике истовремено користећи функцију цв2.гетРотатионМатрик2Д (ротација_центар_к, ротација_центар_и, угао ротације, скала)
И даље користимо опенцв-ову функцију варпАффине да бисмо добили ротацију слике, али уместо матрице превођења као у претходном случају овде користимо матрицу ротације.
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('инпут.јпг') хеигхт, видтх = имаге.схапе # поделите висину и ширину за 2 да бисте ротирали слику око њеног центра ротација_матрик = цв2.гетРотатионМатрик2Д ((видтх / 2, висина / 2), 90,1) ротатед_имаге = цв2.варпАффине (слика, ротација_матрица, (ширина, висина)) цв2.имсхов ('оригинална слика', слика) цв2.ваитКеи (0) цв2.имсхов ('ротирана слика ', ротатед_имаге) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Сада је слика ротирана за 90 степени, обрезана је због величине платна, јер величина платна остаје иста, али због ротације величина слике не одговара величини платна. Може се подесити подешавањем фактора скалирања на негативан, али омогућава црну позадину иза слике.
Дакле, можете подесити висину и ширину слике предвиђањем или нагађањем или постоји други начин ротирања слике транспоновањем, али он би ротирао слику за вишекратнике од 90 степени у смеру супротном од кретања казаљке на сату.
4. Скалирање, промена величине и интерполација
Скалирање и промена величине су афине трансформације, промена величине слике је оно што смо прилично дуго радили, а бавили смо се и интерполацијом, као када промените величину слике у већу величину у којој ширимо пикселе, постоје неке празнине у пиксела и ту долази до интерполације.
Може се десити код повећања величине слике са мање на већу или смањења величине слике са веће на мању.
Технички, интерполација је метода за изградњу нових тачака података (пиксела), у оквиру дискретног скупа познатих тачака података.
Постоје разне врсте метода интерполације у ОпенЦВ-у
цв2.ИНТЕР_АРЕА - добро за скупљање или узимање узорака
цв2.ИНТЕР_НЕАРЕСТ - најбржи
цв2.ЛИНЕАР - добро за зумирање или узимање узорака (подразумевано)
цв2.ЦУБИЦ - бољи
цв2.ИНТЕР_ЛАНЦЗОС4 - најбоље
# промена величине је врло једноставна помоћу функције цв2.ресизе, њени аргументи су # цв2.ресизе (слика, дсизе (величина излазне слике), к_сцале, и_сцале, интерполација) импорт цв2 импорт нумпи као нп имаге = цв2.имреад ('инпут. јпг ') цв2.имсхов (' Оригинал_имаге ', слика) цв2.ваитКеи (0) # направимо слику 3/4 оригиналне величине слике, тј. смањимо на 75% имаге_сцалед = цв2.ресизе (слика, Ноне, фк = 0,75, фи = 0,75) # обзиром да је линеарна интерполација задата метода за отворени цв, не морамо је примењивати као функцију. цв2.имсхов ('скалирајућа_линеарна интерполација', имаге_сцалед) цв2.ваитКеи (0) # удвостручимо величину наше слике имг_доубле = цв2.ресизе (слика, Ноне, фк = 2, фи = 2, интерполатион = цв2.ИНТЕР_ЦУБИЦ) цв2.имсхов ('сцаинг_цубицИнтерполатион', имг_доубле) цв2.ваитКеи (0) # хајде да направимо промену величине тачним димензијама имаге_ресизе = цв2.ресизе (слика, (200.300), интерполација = цв2.ИНТЕР_АРЕА) цв2.имсхов ('сцалинг_екацт', имаге_ресизе) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
5. Сликовне пирамиде - Још један начин промене величине
Слика у пирамиди се односи или на повећање (увећавање слика) или на смањење (смањење слика).
То је једноставно другачији начин промене величине који нам омогућава да лако и брзо прилагодимо слике, смањујући смањење половине висине и ширине нове слике.
Ово је корисно приликом израде детектора предмета који скалирају слике сваки пут када траже неки објекат.
увоз цв2 слика = цв2.имреад ('инпут.јпг') мањи = цв2.пирДовн (слика) већи = цв2.пирУп (мањи) цв2.имсхов ('оригинал', слика) цв2.ваитКеи (0) цв2.имсхов ('мањи', мањи) цв2.ваитКеи (0) цв2.имсхов ('већи', већи) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
На већој слици приметићете да је и даље исте величине оригиналне слике мало замућено јер се претвара из мање слике у већу слику директно. Али ако је интерполирамо, квалитет слике се побољшава као и претходни, јер интерполација процењује пикселе док попуњава размаке када је слика увећана.
Сада извођење истог кода, али са кубном интерполацијом, даје бољи квалитет велике слике. Испод слика приказано је поређење оригиналне слике, увећане верзије слике, мање слике и кубне интерполиране верзије мање слике.
увоз цв2 слика = цв2.имреад ('инпут.јпг') мањи = цв2.пирДовн (слика) већи = цв2.пирУп (мањи) цв2.имсхов ('оригинал', слика) цв2.ваитКеи (0) цв2.имсхов ('мањи', мањи) цв2.ваитКеи (0) цв2.имсхов ('већи', већи) цв2.ваитКеи (0) # повећање квалитета претворене веће слике из мање слике помоћу кубне интерполације имг_доубле = цв2.ресизе (мањи, Нема, фк = 2, фи = 2, интерполација = цв2.ИНТЕР_ЦУБИЦ) цв2.имсхов ('сцаинг_цубицИнтерполатион', имг_доубле) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
НАПОМЕНА: Ако желите да направите више малих копија слика које постају све мање или мање или више великих копија слика које непрестано расту, тада можемо да користимо за петље или док се петље држе унутар функције пирДовн или пирУп .
6. Обрезивање - Исеците област слике коју желите
Исецање слика односи се на издвајање сегмента слике.
ОпенЦВ директно нема функцију обрезивања, али то може лако да уради нумпи помоћу доњег кода
Обрезано = слика
Низ слика стављамо и помоћу алата за индексирање или методе у нумпи дефинишемо почетни ред до крајњег реда и почетну колону до крајње колоне одвојене зарезом који издваја правоугаоник који желимо да обрежемо да бисмо добили слику.
импорт цв2 импорт нумпи као нп имаге = цв2.имреад ('инпут.јпг') висина, ширина = имаге.схапе # узмимо координате почетног пиксела (горе лево од правоугаоника за обрезивање) старт_ров, старт_цол = инт (висина *.25), инт (ширина *.25) # хајде да добијемо завршне координате пиксела (доље десно) енд_ров, енд_цол = инт (висина *.75), инт (ширина *.75) # једноставно користите индексирање да бисте изрезали правоугаоник који желимо обрезати = слика цв2.имсхов ("оригинална слика", слика) цв2.ваитКеи (0) цв2.имсхов ("исечена слика", обрезана ) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Имајте на уму да можете користити вредности пиксела директно уместо старт_цол или старт_ров , оне су дате само да би се корисник лако идентификовао.
7. Аритметичке операције за осветљавање и затамњење слика
Аритметичке операције у ОпенЦВ-у у основи су додавање или одузимање матрица на слици, додавање или одузимање матрица утиче на повећање или смањење осветљености.
Дакле, да бисмо додали или одузели матрице морамо их створити, а нумпи има функцију која се назива нп.онес која даје матрице једнаке величине као и наша слика.
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('инпут.јпг') # креирајте нечију матрицу, а затим је помножите скалом од 100 ' # нп.онес даје матрицу исте димензије као и наша слика са свим вредности су 100 у овом случају М = нп.онес (имаге.схапе, дтипе = "уинт8") * 100 # користимо ово да додамо ову матрицу М на нашу слику # примети пораст осветљености аддед = цв2.адд (слика, М) цв2.имсхов („Додато“, додато) цв2.ваитКеи (0) # на сличан начин такође можемо да одузмемо # примети смањење осветљености одузето = цв2.субтрацт (слика, М) цв2.имсхов („одузето“, одузето) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Тако се ОпенЦВ може користити за примену многих различитих операција обраде слика на слици. Наставићемо са осталим функцијама за манипулацију сликама у следећем водичу.