- Какво представляват изображенията?
- Как компютърът съхранява изображения
- Защо е трудно за една машина да идентифицира изображения
- Приложение и използване на OpenCV
- Инсталиране на OpenCV с Python и Anaconda
- Отваряне и запазване на изображения в OpenCV
- Сиво мащабиращо изображение в OpenCV
- Цветови пространства
- Проучване на отделни компоненти на RGB изображение
- Преобразуване на изображение в отделен RGB компонент
- Представяне на хистограма на изображението
- Рисуване на изображения и фигури с помощта на OpenCV
Изкуството е начин на виждане и те казват, че виждането е вярване, но е и обратното, вярата е виждането и наистина е трудно да си представим как живеем в този свят без дарбата на зрението - нашите очи, колко прекрасно е да си бебе когато очите ни просто се отворят, ние виждаме света и започваме да разпознаваме и виждаме света около нас, но с течение на времето същото прекрасно преживяване става светско. Но докато напредваме с технологията, сме на ръба, където машините също могат да я виждат и разбират. Понастоящем не изглежда научно-фантастично, ако просто отключите телефона си с лицето си, но историята за развитието на машинното зрение е датирана отдавна от повече от 20 години.
Първоначалната официална стъпка в тази област е предприета през 1999 г. в рамките на инициатива на Intel, когато всички изследвания, които се провеждат, са си сътрудничили в рамките на OPEN CV (компютърно зрение с отворен код), първоначално написано на C ++, с първата си голяма версия 1.0 през 2006 г. през 2009 г., трети през 2015 г. и четвърти точно сега през 2018 г. Сега OpenCV има интерфейси C ++, Python и Java и поддържа Windows, Linux, Mac OS, iOS и Android. Така че може лесно да се инсталира в Raspberry Pi с Python и Linux среда. А Raspberry Pi с OpenCV и свързана камера може да се използва за създаване на много приложения за обработка на изображения в реално време, като разпознаване на лица, заключване на лице, проследяване на обекти, откриване на регистрационния номер на автомобила, система за домашна сигурност и т.н.
Преди да започнете да се научите да обработвате изображения с помощта на openCV, важно е да знаете какви са изображенията и как хората и машините възприемат тези изображения.
Какво представляват изображенията?
Изображенията са двуизмерно представяне на спектъра на видимата светлина. А спектърът на видимата светлина е само част от електромагнитния спектър, разположен между инфрачервения и ултравиолетовия спектър.
Как се формират изображенията: - когато светлината се отразява от обект върху филм, сензор или върху ретината.
Ето как работят очите ни, използвайки бариера, за да блокират най-голямата точка на светлините, оставяйки малък отвор, през който светлината може да премине, се нарича апертура и образува много фокусирано изображение и е работещ модел за камера с отвори, но има проблем в камерата с дупка, същото количество светлина ще навлиза в блендата, което не може да бъде подходящо за филма или образуваното изображение, също така не можем да получим фокусирано изображение, за да фокусираме изображението, което трябва да движите филма напред-назад, но това е проблематично в много ситуации.
Или можем да разрешим този проблем, като използваме лещи, той ни позволява да контролираме размера на блендата, а при фотографията, известен като f Stop, обикновено по-ниската стойност на f Stop е по-добра при фотографията.
Размерът на блендата също ни позволява да навлезем в приятна дълбочина на полето, наречена като Боке във фотографията, тя ни позволява да имаме размазан фон, докато се фокусираме върху изображението.
Как компютърът съхранява изображения
Може да сте чували за различни формати на изображения като.png,.jpgG и др. Всичко това е цифрово представяне на нашия аналогов свят, компютрите го правят, като превеждат изображението в цифров код за съхранение и след това интерпретират файла обратно в изображение за дисплей. Но в основата те използват обща платформа за съхраняване на изображенията, и същото важи и за openCV.
OpenCV използва RGB (червено, зелено и синьо) цветно пространство по подразбиране за своите изображения, където всяка пикселна координата (x, y) съдържа 3 стойности, вариращи за интензитети в 8-битова форма, т.е. (0-255, 2 8).
Смесването на различни интензитети на всеки цвят ни дава пълния спектър, затова в живописта или изкуството тези три цвята се разглеждат като основни цветове, а всички останали като вторични, тъй като повечето от вторичните цветове могат да се образуват от първични цветове. Както при жълтото, имаме следните стойности: Червено - 255; Зелено - 255; Синьо - 0.
Сега изображенията се съхраняват в многомерни масиви. При програмирането масивът представлява поредица от колекции от обекти. И тук имаме работа с три типа масиви 1D, 2D и 3D, където „D“ означава размерни.
Цветните изображения се съхраняват в триизмерни масиви, където третите измерения представляват RGB цветовете (което ще видим по-късно) и заедно образуват различна интензивност на пикселите за изображение, докато черно-белите изображения се съхраняват в двумерни масиви а също така има два вида черно-бели изображения Сива скала и двоични изображения.
Изображенията в сива скала се формират от нюансите на сивото на двуизмерен масив, докато двоичните изображения са от пиксели или от черно или от бяло.
Защо е трудно за една машина да идентифицира изображения
Компютърното зрение е предизвикателна задача сама по себе си, можете сами да си представите колко е трудно да се даде на машината усещане за зрение, разпознаване и идентификация. Има следните фактори, които правят компютърното зрение толкова трудно.
- Ограничения на сензора на камерата и обектива
- Вариации на гледната точка
- Смяна на осветлението
- Мащабиране
- Оклузии
- Вариации на обектния клас
- Неясни изображения / Оптични илюзии
Приложение и използване на OpenCV
Въпреки трудността, Computer Vision има много истории за успех
- Роботизирана навигация - Самоуправляващи се автомобили
- Разпознаване и разпознаване на лица
- Търсене на изображения в търсачката
- Четене на регистрационния номер
- Разпознаване на почерк
- Snapchat и филтри за лице
- Разпознаване на обекти
- Проследяване на топка и играч в спорта
- И много други!
Инсталиране на OpenCV с Python и Anaconda
OpenCV е написан на C ++, но е много трудно да го внедрите с C ++ и следователно ние избираме да го реализираме с език на високо ниво като python, а също така има допълнителни ползи от внедряването на OpenCV с python, тъй като Python е един от най-лесните езици за начинаещи също Той е изключително мощен за приложения за наука на данни и машинно обучение, а също така съхранява изображения в масивни масиви, което ни позволява да правим някои много мощни операции доста лесно.
Основното програмиране е полезно с Exposure to High School Level Math, уеб камера, Python 2.7 или 3.6 (Anaconda Package е предпочитан).
Стъпка 1. Изтеглете и инсталирайте пакета Anaconda Python
Отидете на: https://www.anaconda.com/download и изберете в зависимост от времето на вашата машина нейните windows, Linux или mac и можете да изберете за python 2.7 или python 3.7 версия или за 64-битови системи, или за 32-битови системи, но сега на ден по-голямата част от системата е 64 битова.
Разпространението на python от Anaconda идва заедно със студиото Spyder, тетрадките jupyter и подканата anaconda, което прави python супер приятелски за използване. Бихме използвали spyder studio за правене на примери.
Изборът между python 2.7 или 3.7 е напълно неутрален, но обаче за примерите бихме използвали python 3.7, тъй като това е бъдещето на python и ще поеме python 2.7 от 2020 г., също така повечето библиотеки се разработват в python 3.7 бъдещият аспект на python в ума. Също така дава очакваните резултати за основни математически операции като (2/5 = 2.5), докато python 2.7 би го оценил на 2. Също така печатът се третира като функция в python 3.7 (print („здравей“)), така че дава практически на програмистите.
Стъпка 2. Създаване на виртуална платформа с OpenCV
Ще инсталираме OpenCV, като създадем виртуална платформа за шпионка, като използваме подкана Anaconda и YML файла, качени тук.
С YML файловете ще инсталираме всички пакети и библиотеки, които биха били необходими, но ако искате да инсталирате допълнителни пакети, можете лесно да инсталирате чрез подкана anaconda, като изпълните командата на този пакет.
Отидете до иконата за търсене на Windows и намерете терминал за подсказване на anaconda, можете да го намерите във вашата папка anaconda, която току-що сте инсталирали.
След това трябва да намерите изтегления си YML файл и от тук имате два избора или да промените директорията на вашия терминал на мястото, където се изтегля вашият YML файл, или да копирате вашия YML файл в директорията, където най-много е инсталирана вашата анаконда случаи той ще бъде вътре в C: \ устройство, след копиране на вашия YML файл на посоченото място РАЗПОЧНЕТЕ следната команда на вашия ред
conda env create –f virtual_platform_windows.yml
Тъй като моята система работи на windows, YML файлът и командата съответстват на windows, обаче можете да модифицирате според вашата система, като замените windows с linux или mac, съответно.
Забележка: - Ако извличането на пакета дава грешка, първо инсталирайте pytorch и numpy и след това изпълнете горната команда.
Сега намерете навигатора на anaconda и ще има падащо меню от „Applications on ___” и оттам изберете виртуална среда и след това оттам трябва да стартирате Spyder studio.
И това е, готови сте да започнете!
Отваряне и запазване на изображения в OpenCV
Тук обясняваме някои основни команди и терминология за използване на Python в OpenCV. Ще научим за три основни функции в OpenCV imread, imshow и imwrite.
# коментарите в python са дадени със символ #
Импортирайте opencv в python чрез команда
импортиране на cv2
Заредете изображение, използвайки 'imread', указвайки пътя към изображението
image = cv2.imread ('input.jpg')
Сега това изображение се зарежда и съхранява в python като променлива, която ние нарекохме като изображение
Сега, за да покажем нашата променлива на изображението, използваме 'imshow' и първият параметър за функцията imshow е заглавието, показано в прозореца на изображението и трябва да се въведе в (''), за да представлява името като низ
cv2.imshow („здравей, свят“, изображение)
waitkey ни позволява да въвеждаме информация, когато прозорецът на изображението е отворен, като го оставя празен, той просто чака натискането на който и да е бутон, преди да продължи, като поставим цифри (с изключение на 0), можем да определим закъснение за това колко дълго държите прозореца отворен (време в милисекунди тук).
cv2.waitKey ()
'УнищожиВсички Windows' затваря всички отворени прозорци, ако не поставиш това, програмата ти ще се мотае.
cv2.destroyAllWindows ()
, за това ще използваме numpy, numpy е библиотека за програмиране на python за добавяне на поддръжка към големи многомерни масиви и матрици.
внос CV2 #importing numpy внос numpy като NP изображение = cv2.imread ("input.jpg") cv2.imshow ("hello_world", изображение) #shape функция е много полезна, когато гледаме на размери на масив, то връща кортеж, който дава измерение на отпечатване на изображение (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
конзолен изход - (183, 275, 3), Двете измерения на изображението са 183 пиксела във височина и 275 пиксела в ширина и 3 означава, че има три други компонента (R, G, B), които правят това изображение (показва че цветните изображения се съхраняват в триизмерни масиви).
print ('Височина на изображението:', (image.shape, 'pixels')) print ('Ширина на изображението:', (image.shape, 'pixels'))
конзолен изход - Височина на изображението: (183, 'пиксели')
Ширина на изображението: (275, „пиксели“)
Запазване на редактираното изображение в OpenCV
Използваме 'imwrite' за посочване на името на файла и изображението, което ще бъде запазено.
cv2.imwrite ('output.jpg', image) cv2.imwrite ('output.png', image)
Първият аргумент е името на файла, който искаме да запазим, {за четене или за запазване на файла, който използваме (''), за да го посочим като низ}, а вторият аргумент е името на файла.
OpenCV ви позволява да запазвате изображението в различни формати.
Сиво мащабиращо изображение в OpenCV
Мащабирането на сивото е процес, при който изображението се преобразува от пълноцветен в сиви нюанси (черно и бяло)
В opencv много функции скалират изображенията в сива скала преди обработка. Това се прави, защото опростява изображението, като действа почти като намаляване на шума и увеличава времето за обработка, тъй като в изображението има по-малко информация (тъй като изображенията в сивата скала се съхраняват в двумерни масиви).
импортиране на cv2 # зареди нашето входно изображение image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # използваме cvtcolor, за да конвертираме в сива скала grey_image = cv2.cvtColor (изображение, cv2.COLOR_BGR2GREY) cv2.imshow ('сива скала', сива_изображение) cv2.waitKey () cv2.destroyALLWindows ()
По-опростен начин за конвертиране на изображение в скала на сивото е просто добавяне на аргумента 0 в imread функция настрана към името на изображението
импортиране на cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('grayscale', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy as np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () grey_image = cv2.cvtColor (image, cv2.COLOR_BGR2GREY) cv2.imshow ('сива скала', сива_изображение) print (grey_image.shape) cv2.waitKey () cv2.destroyALLWindows ()
Конзолен изход: - (183, 275, 3) - за цветно изображение
(183, 275) - за изображение в сива скала
Следователно ясно показва, че цветните изображения са представени от триизмерни масиви, докато изображенията в сиво са с двумерни масиви.
Цветови пространства
Цветните пространства са начинът, по който се съхраняват изображенията. RGB, HSV, CMYK са различните цветови пространства, това са просто прости начини за представяне на цвета.
RGB - червено, зелено и синьо.
HSV - оттенък, наситеност и стойност.
И CMYK често се използва в мастиленоструйни принтери.
RGB или BGR цветово пространство
Цветовото пространство по подразбиране на OpenCV е RGB. RGB е добавен цветен модел, който генерира цветове чрез комбиниране на сини, зелени и червени цветове с различна интензивност / яркост. В OpenCV използваме 8-битова дълбочина на цветовете.
- Червено (0-255)
- Синьо (0-255)
- Зелено (0-255)
Въпреки това OpenCV всъщност съхранява цвят в BGR формат.
Забавен факт: - Използваме BGR ред в компютрите поради това как неподписаните 32-битови цели числа се съхраняват в паметта, но все пак се съхранява като RGB. Цялото число, представляващо цвят, напр.: - 0X00BBGGRR ще се съхранява като 0XRRGGBB.
HSV цветно пространствоHSV (Hue, Saturation & value / Brightness) е цветово пространство, което се опитва да представи цветовете, които хората го възприемат. Той съхранява информация за цвета в цилиндрично представяне на RGB цветни точки.
Hue - цветова стойност (0-179)
Наситеност - жизненост на цвета (0-255)
Стойност - Яркост или интензивност (0-255)
Форматът на цветовото пространство HSV е полезен при цветното сегментиране. В RGB филтрирането на специфичен цвят не е лесно, но HSV улеснява много задаването на цветови диапазони за филтриране на определен цвят, така както ги възприемаме.
Hue представлява цвета в HSV, стойността на нюанса варира от 0 - 180, а не 360, така че не завършва пълния кръг и така се картографира по различен начин от стандартния.
Филтри за цветен диапазон
- Червено - (165-15)
- Зелено - (45-75)
- Синьо - (90-120)
Тъй като знаем, че изображенията се съхраняват в RGB (червено, зелено и синьо) цветно пространство и така OpenCV ни показва същото, но първото нещо, което трябва да запомним за RGB формата на opencv, е, че всъщност е BGR и можем да го разберем, като разгледаме форма на изображението.
импортиране cv2 импортиране numpy като np image = cv2.imread ('input.jpg') # B, G, R стойност за първите 0,0 пиксела B, G, R = изображение отпечатване (B, G, R) печат (изображение.shape) # сега, ако приложим това върху изображението в сивото изображение grey_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (grey_img.shape) #gray_image стойност на пиксела за печат от 10,50 пиксела (grey_img)
Конзолен изход: печат (B, G, R) - 6 11 10
печат (image.shape) - (183, 275, 3)
печат (сива_имг. форма) - (183, 275)
печат (grey_img) - 69
Сега в изображението в сива скала има само две измерения, тъй като помним, че цветното изображение се съхранява в три измерения, като третото измерение е (R, G, B), докато в сивата скала присъстват само две измерения, тъй като (R, G, B) отсъства и за определена позиция на пиксела получаваме само една стойност, докато в цветно изображение имаме три стойности.
Друго полезно цветово пространство е HSV
импортиране на cv2 image = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (image, cv2.COLOR_BGR2HSV) cv2.imshow ('HSV image', hsv_image) cv2.imshow ('Hue channel', hsv_image) cv2. imshow ('наситен канал', hsv_image) cv2.imshow ('стойност канал', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
След стартиране на кода можете да видите четирите изображения, от които три са от отделните канали, а едното е комбинирано HSV изображение.
Изображението на Hue канала е доста тъмно, тъй като стойността му варира само от 0 до 180.
Също така имайте предвид, че функцията imshow се опитва да ви покаже RGB или BGR изображение, но преобразуването HSV го припокрива.
Също така каналът за стойности ще бъде подобен на скалата на сивото на изображението поради неговата яркост.
Проучване на отделни компоненти на RGB изображение
импортиране на cv2 image = cv2.imread ('input.jpg') # функцията за разделяне на opencv разделя imageinti всеки цветен индекс B, G, R = cv2.split (image) cv2.imshow ("Red", R) cv2.imshow ("Зелена", G) cv2.imshow ("Blue", B) #making оригиналното изображение чрез сливане на отделните компоненти цветни сля = cv2.merge () cv2.imshow ("слива", слива) #amplifying синият цвят слива = cv2.merge () cv2.imshow ("обединено със синьо усилване", обединено) #представяне на формата на отделни цветни компоненти. # изходът трябва да бъде само в две измерения, което би било височина и ширина, тъй като третият елемент на RGB компонента е индивидуално представен печат (B.shape) print (R.форма) печат (G.shape) cv2.waitKey (0) cv2.destroyAllWindows ()
Изход на конзолата: #размери на изображението от функцията за фигура
(183, 275)
(183, 275)
(183, 275)
Преобразуване на изображение в отделен RGB компонент
В долния код създадохме матрица от нули с размерите на изображението HxW, нула връща масив, пълен с нули, но със същите размери.
Функцията Shape е много полезна, когато разглеждаме измерението на изображението и тук сме направили нарязване на тази функция на формата. Така формата ще грабне всичко до определените точки, т.е. до вторите определени точки, които ще бъдат височина и ширина на изображението, тъй като третата представлява RGB компонент на изображението и ние нямаме нужда от него тук.
import cv2 import numpy as np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) нули = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("ЧЕРВЕНО", cv2.merge ()) cv2.imshow ("Зелено", cv2.merge ()) cv2.imshow ("Синьо", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Представяне на хистограма на изображението
Хистограмното представяне на изображението е методът за визуализиране на компонентите на изображенията.
Следващият код ви позволява да анализирате изображението чрез цветната хистограма на неговите комбинирани и отделни цветни компоненти.
import cv2 import numpy като np # трябва да импортираме matplotlib, за да създадем хистограмни графики import matplotlib.pyplot като plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, Няма,,) # начертаваме хистограма, ravel () разширява нашия масив от изображения plt.hist (image.ravel (), 256,) plt.show () #viewing отделни цветни канали color = ('b', 'g', 'r') # ние знаем отделете цвета и нанесете всеки в хистограма за i, col в enumerate (цвят): histogram2 = cv2.calcHist (,, Няма,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Нека разберем функцията calcHist с всеки от нейните индивидуални параметри
cv2.calcHist (изображения, канали, маска, хистразмер , диапазони)
Изображения: това е изходното изображение от тип uint 8 или float 32. То трябва да бъде дадено в квадратни скоби, т.е. „”, което също показва неговия масив от второ ниво, тъй като изображението за opencv е данни във форма на масив.
Канали: дава се и в квадратни скоби. Това е индексът на канала, за който изчисляваме хистограма, например ако входът е изображение в сива скала, стойността му е, за цветни изображения, които можете да предадете, или за изчисляване на хистограма съответно на син, зелен и червен канал.
Маска: изображение на маска. за да се намери хистограмата на цялото изображение, тя се дава като „няма“. но ако искате да намерите хистограмата на определен регион на изображението, трябва да създадете изображение на маска за това и да го дадете като маска.
Histsize: Това представлява нашия BIN брой. Необходимо е да се даде в квадратни скоби за пълна скала, която преминаваме.
Обхвати: Това е нашият обхват, обикновено е
Рисуване на изображения и фигури с помощта на OpenCV
По-долу има няколко примера за рисуване на линии, правоъгълник, многоъгълник, кръг и т.н. в OpenCV.
import cv2 import numpy като np #creating a black square image = np.zeros ((512,512,3), np.uint8) # можем да създадем и това черно-бяло, но няма да има промени image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("черен правоъгълник (цвят)", изображение) cv2.imshow ("черен правоъгълник (черно-бяло)", image_bw)
Линия
# създайте линия върху черен квадрат # cv2.line (изображение, начални координати, крайни координати, цвят, дебелина) # изчертаване на диагонална линия с дебелина 5 пиксела image = np.zeros ((512,512,3), np.uint8) cv2.line (изображение, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("синя линия", изображение)
Правоъгълник
# създайте правоъгълник върху черен квадрат # cv2.rectangle (изображение, начални координати, крайни координати, цвят, дебелина) # рисуване на правоъгълник с дебелина 5 пиксела image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (изображение, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("правоъгълник", изображение)
#creaing a circle over a black square # cv2.circle (изображение, център, радиус, цвят, запълване) image = np.zeros ((512,512,3), np.uint8) cv2.circle (image, (100,100), (50), (255,127,0), - 1) cv2.imshow ("кръг", изображение)
#creating a polygon image = np.zeros ((512,512,3), np.uint8) #lets дефинира четири точки pts = np.array (,,,], np.int32) #lets сега прекроява нашите точки във формата, изисквана полилинии pts = pts.reshape ((- 1,1,2)) cv2.polylines (image,, True, (0,255,255), 3) cv2.imshow ("polygon", image)
# пускане на текст с помощта на opencv # cv2.putText (изображение, „текст за показване“, начална начална точка, шрифт, размер на шрифта, цвят, дебелина) image = np.zeros ((512,512,3), np.uint8) cv2. putText (image, "hello world", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("hello world", image) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision и OpenCV са много обширни теми за разглеждане, но това ръководство би било добра отправна точка за изучаване на OpenCV и обработка на изображения.