- 1. Битовне операције и маскирање
- 2. Конволуција и замућење
- 3. Оштрење - Обртање слике се замућује
- 4. Уситњавање (бинизација)
- 5. Проширење, ерозија, отварање / затварање
- 6. Откривање ивица и градијенти слике
- 14. Перспектива и Афина трансформација
- 8. Апликација за скице уживо
У претходним туторијалима смо научили о ОпенЦВ-у и извршили неке основне обраде слика, а затим смо у следећем туториалу урадили неке манипулације сликама у ОпенЦВ-у, попут обрезивања, ротације, трансформације слике итд. Дакле, у наставку са претходним туторијалом за манипулацију сликама, овде учимо још неке технике манипулације сликама попут и на крају водича ћемо изградити питхон-опенцв програм за прављење живих скица из фида уживо веб камере. Ова апликација ће користити многе функције обраде слика које смо до сада научили или ћемо научити у овом упутству, па ће ово бити добар практични пример за покривање свих функција.
Као што је речено у претходном водичу, ОпенЦВ је Опен Соурце Цоммутер Висион Либрари која има Ц ++, Питхон и Јава интерфејсе и подржава Виндовс, Линук, Мац ОС, иОС и Андроид. Тако да се лако може инсталирати у Распберри Пи са Питхон и Линук окружењем. А Распберри Пи са ОпенЦВ и прикљученом камером може се користити за стварање многих апликација за обраду слика у стварном времену попут откривања лица, закључавања лица, праћења предмета, откривања таблица аутомобила, кућног сигурносног система итд.
У овом упутству ћемо видети још неке манипулације сликама помоћу Питхон ОпенЦВ-а. Овде ћемо научити да применимо следећу функцију на слику користећи Питхон ОпенЦВ:
- Битовне операције и маскирање
- Замотавање и замућење
- Оштрење - Обртање слике се замућује
- Праг (бинарисање)
- Проширење, ерозија, отварање / затварање
- Откривање ивица и градијенти слике
- Перспектива и Афина трансформација
- Апликација за скице уживо
1. Битовне операције и маскирање
Операције у битовима помажу вам у маскирању слика и помажу вам да креирате неке једноставне слике.
Израда квадрата
импорт цв2 импорт нумпи као нп # користимо само две димензије јер је ово слика у сивим тоновима, ако смо користили слику у боји, тада бисмо користили правоугаоник = нп.зерос ((300,300,3), нп.уинт8) # Прављење квадрата квадрат = нп.зерос ((300,300), нп.уинт8) цв2.рецтангле (квадрат, (50,50), (250,250), 255, -1) цв2.имсхов ("квадрат", квадрат) цв2. ваитКеи (0)
Прављење елипсе
елипса = нп.зерос ((300.300), нп.уинт8) цв2.еллипсе (елипса, (150.150), (150.150), 30.0.180.255, -1) цв2.имсхов ("елипса", елипса) цв2.ваитКеи (0)
Експериментисање са битовним операцијама
#АНД_приказује само тамо где се та два пресецају
БитвисеАНД = цв2.битвисе_анд (квадрат, елипса) цв2.имсхов ("АНД", БитвисеАНД) цв2.ваитКеи (0)
#ОР_приказује само тамо где је квадрат или елипса
БитвисеОР = цв2.битвисе_ор (квадрат, елипса) цв2.имсхов ("ИЛИ", БитвисеОР) цв2.ваитКеи (0)
#КСОР_приказује само тамо где било који од њих постоји сам по себи
БитвисеКСОР = цв2.битвисе_кор (квадрат, елипса) цв2.имсхов ("КСОР", БитвисеКСОР) цв2.ваитКеи (0)
#НОТ_показује све што није део елипсе и НЕ може се применити само на једну фигуру
БитвисеНОТ_елп = цв2.битвисе_нот (елипса) цв2.имсхов ("НОТ_еллипсе", БитвисеНОТ_елп) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
2. Конволуција и замућење
Конволуција је математичка операција изведена на две функције производњу треће функцију која је обично модификована верзија оригиналне функције.
Излазна слика = слика Функција Величина језгра
У рачунарском виду користимо језгра да одредимо величину преко које покрећемо нашу функцију манипулације над нашом сликом.
Замућење је операција у којој просечимо пикселе унутар региона (језгра)
ОпенЦВ замућује слику применом језгара, кернел вам говори како да промените вредност било ког датог пиксела комбиновањем са различитом количином суседних пиксела које се језгро примењује на сваки пиксел на слици један по један да би се добила коначна слика.
Једноставно речено, конволуција слике је једноставно умножавање две матрице по елементима, а затим збир.
То једноставно можемо разумети на следећем примеру.
Горе наведено је 3Кс3 језгро.
Множимо са 1/25 да бисмо нормализовали, односно сумирали на 1, повећавали смо или смањивали интензитет као у случају осветљавања или затамњења слика.
Хајде да тест за ОпенЦВ замућење метод филтер2Д, даје функција цв2.филтер2Д (слика, -1, језгро)
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('елепхант.јпг') цв2.имсхов ('оригинал', имаге) цв2.ваитКеи (0)
#креирање матрице језгра 3к3
кернел_3к3 = нп.онес ((3,3), нп.флоат32) / 9
# користимо цв2.филтер2Д за савијање језгра са сликом
замагљено = цв2.филтер2Д (слика, -1, кернел_3к3) цв2.имсхов ('3к3_блурринг', замагљено) цв2.ваитКеи (0)
#креирање матрице језгра 7к7
кернел_7к7 = нп.онес ((7,7), нп.флоат32) / 49
# користимо цв2.филтер2Д за савијање језгра са сликом
замућено = цв2.филтер2Д (слика, -1, кернел_7к7) цв2.имсхов ('7к7_блурринг', замућено) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Постоје и друге врсте замућења:
цв2.блур - Просек вредности у наведеном прозору.
цв2.ГауссианБлур - Слично, али користи Гауссов прозор (већи нагласак на тачкама око центра).
цв2.медианБлур– Користи медијану свих елемената у прозору.
цв2.билатералФилтер - замућује се, док ивице остају оштре, али задржава детаље на ивицама и линијама.
Доље ћемо видети један по један, прво ћемо приказати оригиналну слику користећи доњи код:
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('елепхант.јпг') цв2.имсхов ('оригинал', имаге) цв2.ваитКеи (0)
цв2.блур:
У овом методу се усредњавање врши савијањем слике са нормализованим филтером оквира, ово заузима место испод оквира и замењује централни елемент. Овде величина кутије мора бити чудна и позитивна .
# цв2.блур блур = цв2.блур (слика, (3,3)) цв2.имсхов ('У просеку', замућење) цв2.ваитКеи (0)
цв2.ГауссианБлур:
# цв2.ГауссианБлур # уместо бок филтера, покушајмо са Гауссовим језгром Гауссиан = цв2.ГауссианБлур (слика, (7,7), 0) цв2.имсхов ('Гауссиан блурринг', Гауссиан) цв2.ваитКеи (0)
цв2.медианБлур:
Потребна је средња вредност свих пиксела испод подручја језгра и централни елемент је замењен овом средњом вредношћу.
# цв2.медианБлур # узима медијану свих пиксела испод подручја језгра и централни елемент # замењује се овом средњом вредношћу. средња = цв2.медианБлур (слика 5) цв2.имсхов ('средња замућење', медијана) цв2.ваитКеи (0)
цв2.билатералФилтер:
Двострано је врло ефикасно у уклањању буке, а истовремено задржава оштре ивице
# цв2.билатералФилтер # Билатерал је врло ефикасан у уклањању буке, а истовремено задржава оштре ивице билатерал = цв2.билатералФилтер (слика, 9,75,75) цв2.имсхов ('обострано замућење', билатерално) цв2.ваитКеи (0) цв2. уништитиАллВиндовс ()
Имаге Де-бука-не локално значи Оштећење
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('елепхант.јпг') цв2.имсхов ('оригинал', имаге) цв2.ваитКеи (0)
#параметер иза Ноне је јачина филтра 'х' (5-10 је добар опсег) # нект је х за компоненте боје, поново постављена иста вредност као х
дст = цв2.фастНлМеансДеноисингЦолоред (слика, Ниједно, 6,6,7,21) цв2.имсхов ('Брзо значи деноис', дст) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Постоје 4 варијације одумирања не-локалних средстава
цв2.фастНлМеансДеноисинг () - за једну слику сиве скале
цв2.фастНлМеансДеноисингЦолоред () - Једнобојна слика
цв2.фастНлмеансДеноисингМулти () - за сиву скалу секвенце слика
цв2.фастНлмеансДеноисингцолоредМулти () - за слијед у боји
3. Оштрење - Обртање слике се замућује
Оштрење је супротно замућењу, оно појачава или наглашава ивице слике.
Кернел =,,
Наша матрица језгра сумира до једног, тако да нема потребе за нормализацијом (тј. Множењем са фактором на исту осветљеност као оригинал), ако језгро није нормализовано на 1, слика би била светлија или тамнија.
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('елепхант.јпг') цв2.имсхов ('оригинал', имаге) цв2.ваитКеи (0)
кернел_схарпенинг = нп.арраи (,
])
#апплиинг изоштравање језгра на улазну слику
изоштрено = цв2.филтер2Д (слика, -1, оштрење језгра) цв2.имсхов ('изоштрена слика', изоштрено) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
4. Уситњавање (бинизација)
Праговање је чин претварања слике у бинарни облик. У опенцв постоји одвојена функција за граничну вредност дефинисана као
Цв2.тхресхолд (слика, вредност прага, максимална вредност, врста прага)
Постоје следеће врсте прагова:
- цв2.ТХРЕСХ_БИНАРИ - најчешћи
- цв2. ТХРЕСХ_БИНАРИ_ИНВ - најчешћи
- цв2.ТХРЕСХ_ТРУНЦ
- цв2.ТХРЕСХ_ТОЗЕРО
- цв2. ТХРЕСХ_ТОЗЕРО_ИНВ
НАПОМЕНА: слика је потребна да би се претворила у скале сиве пре прага
импорт цв2 импорт нумпи ас нп # лоад имаге ас граисцале имаге = цв2.имреад ('градиент.јпг', 0) цв2.имсхов ('оригинал', имаге) цв2.ваитКеи (0)
#валуе испод 127 иде на 0 (црно), а изнад 127 иде на 255 (бело)
_, тхресх1 = цв2.тхресхолд (слика, 127.255, цв2.ТХРЕСХ_БИНАРИ) цв2.имсхов ('1 праг', тхресх1) цв2.ваитКеи (0)
#валуе испод 127 иде на 255, а вредности изнад 127 иде на 0 (обрнуто од горе)
_, тхресх2 = цв2.тхресхолд (слика, 127.255, цв2.ТХРЕСХ_БИНАРИ_ИНВ) цв2.имсхов ('2 праг', тхресх2) цв2.ваитКеи (0)
#валуе изнад 127 су скраћени (задржани) на 127, аргумент 255 је неискоришћен.
_, тхресх3 = цв2.тхресхолд (слика, 127.255, цв2.ТХРЕСХ_ТРУНЦ) цв2.имсхов ('3 тхресх трунц', тхресх3) цв2.ваитКеи (0)
#вредности испод 127 иду на 0, изнад 127 су непромењене
_, тхресх4 = цв2.тхресхолд (слика, 127.255, цв2.ТХРЕСХ_ТОЗЕРО) цв2.имсхов ('4 праг', тхресх4) цв2.ваитКеи (0)
#Ревесрсе горе, испод 127 је непромењен, изнад 127 иде на нулу
_, тхресх5 = цв2.тхресхолд (слика, 127.255, цв2.ТХРЕСХ_ТОЗЕРО_ИНВ) цв2.имсхов ('5 праг', тхресх5) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
5. Проширење, ерозија, отварање / затварање
То су операције у пољу математичке морфологије
Дилатација - додаје пикселе границама објекта на слици.
Ерозија - уклања пикселе на границама објекта на слици.
Отварање - Ерозија праћена дилатацијом.
Затварање - дилатација праћена ерозијом.
Отварање је од велике помоћи у уклањању шума на сликама, јер прво разређује слику ерозијом (уклања буку), а затим је шири.
Конфузија са ширењем и ерозијом
Понекад постоји забуна између ширења и ерозије обично на сликама са белом позадином, јер опенцв сматра белу позадину као слику која се шири или еродира уместо оригиналне слике, тако да у овом случају ерозија делује као дилатација и обрнуто, као што је приказано на узорку слике приказано испод.
Запамтите, Дилатион додаје пикселе на границе објеката на слици, док Ерозија уклања пикселе на границама објеката на слици
импорт цв2 импорт нумпи ас нп имаге = цв2.имреад ('имагецв.пнг', 0) цв2.имсхов ('оригинал', имаге) цв2.ваитКеи (0)
# Ерозија
# дефинишемо величину језгра
кернел = нп.онес ((5,5), нп.уинт8)
#сад еродирамо слику, овде понављање није када желите да еродирате слику
ерозија = цв2.ероде (слика, језгро, итерације = 1) цв2.имсхов ('Ерозија', ерозија) цв2.ваитКеи (0)
# дилатација
дилатион = цв2.дилате (слика, кернел, итерације = 1) цв2.имсхов ('дилатација', дилатација) цв2.ваитКеи (0)
#опенинг, Добро за уклањање буке
отварање = цв2.морпхологиЕк (слика, цв2.МОРПХ_ОПЕН, језгро) цв2.имсхов ('отварање', отварање) цв2.ваитКеи (0)
#цлосинг, добро за уклањање буке
затварање = цв2.морпхологиЕк (слика, цв2.МОРПХ_ЦЛОСЕ, језгро) цв2.имсхов ('затварање', затварање) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
6. Откривање ивица и градијенти слике
Откривање ивица је веома важно подручје у рачунарском виду, посебно када се ради о контурама.
Рубови се могу дефинисати као границе слике, заправо су то ивице које дефинишу објекат на сликама и чувају пуно информација о слици.
Формално се ивице могу дефинисати као нагле промене (дисконтинуитети) на слици и могу кодирати онолико информација колико и пиксели.
Горња слика приказује како рачунарски вид идентификује и препознаје слику.
Алгоритми за откривање ивица: - Постоје три главне врсте алгоритама за откривање ивица
- Собел - за наглашавање вертикалних или хоризонталних слика.
- Лаплациан - оптималан због ниске стопе грешака, добро дефинисаних ивица и тачне детекције.
- Цанни Едге алгоритам за откривање (преусмерио Јохн Ф.Цанни 1986)
1. Примењује Гауссову замућеност
2. Проналази градијент интензитета слике
3. примењује потискивање без максимума (тј. Уклања пикселе који нису ивице).
4. Хистереза примењује праг (тј. Ако је пиксел унутар горњег и доњег прага, сматра се ивицом)
импорт цв2 импорт нумпи као нп имаге = цв2.имреад ('инпут.јпг', 0) висина, ширина = имаге.схапе
#собел
#екстракција собел ивица
собел_к = цв2.Собел (слика, цв2.ЦВ_64Ф, 0,1, ксизе = 5) собел_и = цв2.Собел (слика, цв2.ЦВ_64Ф, 1,0, ксизе = 5) цв2.имсхов ('оригинал', слика) цв2.ваитКеи (0) цв2.имсхов ('собелк', собел_к) цв2.ваитКеи (0)
# Собели
цв2.имсхов ('собели', собел_и) цв2.ваитКеи (0)
собел_ОР = цв2.битвисе_ор (собел_к, собел_и) цв2.имсхов ('собелОР', собел_ОР) цв2.ваитКеи (0)
#лаплаиан
лаплациан = цв2.Лаплациан (слика, цв2.ЦВ_64Ф) цв2.имсхов ('лаплациан', лаплациан) цв2.ваитКеи (0)
#анни алгоритам за откривање ивица користи вредности градијента као прагове #у
цанни-у морамо да дамо две вредности: праг1 и праг2.
# било који градијент већи од прага 2 сматра се ивицом.
# било који градијент већи од прага 1 сматра се да није ивица.
# вредности између прага 1 и прага 2 су или ивичне или
неребрене #начин повезивања њихових интензитета, у овом случају се сматра било која вредност испод 60 # без ивица, док се било која вредност изнад 120 сматра ивицама.
цанни = цв2.Цанни (слика, 60.120) цв2.имсхов ('цанни', цанни ) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
14. Перспектива и Афина трансформација
Вратимо се корак уназад и погледајмо афине и неафинне трансформације, оригинална слика приказана доле је очигледно неафинна слика јер ће се ивице у неком тренутку срести, међутим, можемо је исправити искривљењем и заузимањем перспективе трансформисати.
За ову перспективну трансформацију потребне су нам четири координате оригиналне слике, а затим четири тачке излазне слике, означене су тачкама_А и тачкама_Б. Прво уз помоћ ових тачака израчунавамо матрицу трансформације М уз помоћ функције гетПерспецтивеТрансформ.
А онда се ова матрица даје функцији варпПерспецтиве да генерише коначни излаз.
Сада прво покушајмо са перспективом трансформације.
импорт цв2 импорт нумпи ас нп импорт матплотлиб.пиплот ас плт имаге = цв2.имреад ('папер.јпг') цв2.имсхов ('оригинал', имаге) цв2.ваитКеи (0)
#координата 4 угла оригиналне слике
поинтс_А = нп.флоат32 (,,,])
# координате 4 угла жељеног излаза
# користимо однос А4 папира 1: 1,41
поинтс_Б = нп.флоат32 (,,,])
# користите два скупа две тачке за израчунавање матрице претпостављене трансформације, М.
М = цв2.гетПерспецтивеТрансформ (поинтс_А, поинтс_Б) варпед = цв2.варпПерспецтиве (слика, М, (420.594)) цв2.имсхов ('варппреспецтиве', варпед ) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
Афина трансформација је лакша од неафинне трансформације, јер су нам потребне само три тачке да бисмо је добили. Читав процес иде исто, али уместо перспективне трансформације сада имамо афинирану трансформацију, а такође дефинишемо и колоне и редове у варпАффине из функције облика, уместо да је ручно уносимо.
импорт цв2 импорт нумпи ас нп импорт матплотлиб.пиплот ас плт имаге = цв2.имреад ('бок.јпг') редови, цолс = имаге.схапе цв2.имсхов ('оригинал', имаге) цв2.ваитКеи (0)
#координата 3 угла оригиналне слике
поинтс_А = нп.флоат32 (,,])
# координате 3 угла жељеног излаза
# користимо однос А4 папира 1: 1,41
поинтс_Б = нп.флоат32 (,,])
# искористите два скупа две тачке за израчунавање
матрице Афин # трансформације, М.
М = цв2.гетАффинеТрансформ (поинтс_А, поинтс_Б) варпед = цв2.варпАффине (слика, М, (колоне, редови)) цв2.имсхов ('варпаффине', варпед ) цв2.ваитКеи (0) цв2.дестроиАллВиндовс ()
8. Апликација за скице уживо
Пре свега, честитајте себи што сте се исплатили за овај мини пројекат након што сте прочитали све функције за манипулацију сликама горе. Дакле, у овом мини пројекту Питхон ОпенЦВ научићемо неке нове концепте петљи и функција. Ако сте упознати са програмирањем, морате имати ширу представу о томе која је функција и петље. Међутим, у питхону основни концепт петљи и функција остаје исти, али начин њиховог дефинисања се мало мења.
Дакле, на почетку овог програма можемо видети одређену групу изјава под насловом „ деф скица (слика): “ ово је формална дефиниција функције која је група изјава које заједно раде за одређени излаз.
Дакле, ова скица је функција, у питхон-у функција је дефинисана са „деф“ и завршава се са „:“. Такође изрази који морају бити унутар функције или можете рећи који су потребни да би функција функционисала исправно, функција аутоматски поравнава бок. Дакле, да би изашли из функција, изјаве је требало потпуно поравнати улево. За даље референце можете се обратити гооглеу како су функције дефинисане у питхону.
Дакле, у овој функцији скице увели смо неколико слојева обраде слика који се заједно комбинују дајући излаз. Прво, слика се претвара у сиву скалу, тако да је опенцв може лако обрадити, а затим се на слику сиве скале примењује Гауссов замућење како би се смањио шум. Тада се ивице извлаче уз помоћ алгоритма за откривање ивица лименке, а затим се на слику дефинисану ивицом примењује бинарни инверз, овде се бинарни инверз такође може урадити битвисе_НОТ, али ми смо намерно изабрали бинарни инверзни овај праг јер даје слободу да постави његове параметре док не добијемо јасну слику.
Такође да приметимо да функција узима слику аргумената и враћа два аргумента рет и маску. Иако је рет логичка вредност која говори да се функција успешно изводи или не, а маска је коначни излаз функције, односно обрађена слика.
Тада је други концепт рада веб камере у опенцв-у, што чини функција цв2.ВидеоЦаптуре (0) , која складишти слику у поклопцу објекта који се може прочитати помоћу функције цап.реад () , такође овде да се примети та капица. реад () је унутар бесконачне вхиле петље јер је непрекидно морао хватати слике, дајући му осећај видео записа уживо, при чему би брзина кадрова у видео запису била брзина кадрова ваше веб камере која је углавном између 24 и 60 фпс.
цап.реад () враћа рет и фраме, где је рет логичка вредност која указује да је функција успешно покренута или не, а оквир садржи слику коју је снимила веб камера.
Испод је комплетни Питхон ОпенЦВ код за покретање Ливе Скетцх-а
импорт цв2 импорт нумпи ас нп # скетцх генератинг фунцтион деф скетцх (имаге): # претвори слику у сивине имг_граи = цв2.цвтЦолор (имаге, цв2.ЦОЛОР_БГР2ГРАИ) # чишћење слике помоћу Гауссиан блур имг_граи_блур = цв2.ГауссианБлур (имг_граг 5,5), 0) # ектрацт едге цанни_едгес = цв2.Цанни (имг_граи_блур, 10,70) #до инверт бинаризе имаге рет, маск = цв2.тхресхолд (цанни_едгес, 70,255, цв2.ТХРЕСХ_БИНАРИ_ИНВ) ретурн маск # инициализе вебцам, цап је објекат обезбеђен видео снимањем # садржи логичку вредност која показује да ли је успела (рет) # садржи и слике прикупљене са веб камере (фраме) цап = цв2.ВидеоЦаптуре (0) вхиле Труе: рет, фраме = цап.реад () цв2.имсхов ('ливескетцхер', скетцх (фраме)) иф цв2.ваитКеи (1) == 13: # 13 је ентеркеи бреак # релеасе цамера анд цлосе виндов, не заборавите да пустите веб камеру уз помоћ цап.релеасе () цап.релеасе () цв2.дестроиАллВиндовс ()
Дакле, ово је крај 2. дела манипулација са сликама у Питхон-ОпенЦВ. Да бисте добро разумели рачунарски вид и ОпенЦВ, прођите кроз претходне чланке (Почетак рада са Питхон ОпенЦВ-ом и манипулацијом сликама у Питхон ОпенЦВ-у (1. део) и моћи ћете да направите нешто кул са Цомпутер Висион-ом.