- 1. Трансформации на изображения - афинна и неафинна трансформация
- 2. Преводи на изображения - Преместване на изображението нагоре, надолу, наляво и надясно
- 3. Завъртане на изображението - завъртане на изображението
- 4. Мащабиране, преоразмеряване и интерполация
- 5. Пирамиди на изображението - Друг начин за преоразмеряване
- 6. Изрязване - Изрязване на областта на изображението, което искате
- 7. Аритметични операции за осветяване и потъмняване на изображения
В предишния урок, ние сме научили за OpenCV и направи някои основни обработка на изображението го използвате като сив мащабиране, наситеността на цветовете, хистограма, цветни пространства, RGB компонент и т.н. Както казах в предишния урок, OpenCV е Open Source Commuter Vision библиотека, която има C ++, Python и Java интерфейси и поддържа Windows, Linux, Mac OS, iOS и Android. Така че може лесно да се инсталира в Raspberry Pi с Python и Linux среда. А Raspberry Pi с OpenCV и свързана камера може да се използва за създаване на много приложения за обработка на изображения в реално време, като разпознаване на лица, заключване на лица, проследяване на обекти, откриване на регистрационния номер на автомобила, система за домашна сигурност и т.н.
В този урок ще видим как ще манипулираме изображението с помощта на OpenCV. Тук ще се научим да прилагаме следната функция върху изображение с помощта на OpenCV:
- Трансформации на изображения - афинна и неафинна трансформация
- Преводи на изображения - Преместване на изображението нагоре, надолу, наляво и надясно
- Завъртане на изображението - Въртене на изображението
- Мащабиране, преоразмеряване и интерполация
- Image Pyramids - Друг начин за преоразмеряване
- Изрязване - Изрязване на областта на изображението, което искате
- Аритметични операции за осветяване и потъмняване на изображения
1. Трансформации на изображения - афинна и неафинна трансформация
Трансформациите са геометрични изкривявания, приложени върху изображение, изкривяванията със сигурност тук не означават грешки, а тип корекция, за да се коригират проблемите на перспективата, произтичащи от точката, където изображението е заснето. Има два вида трансформации на изображения - Affine и Non-Affine
Аффинните трансформации са от три вида мащабиране, завъртане и транслация, важното при афините трансформации е, че линиите са успоредни преди и след трансформации на изображения.
Неафинните трансформации или проективните трансформации не запазват паралелизъм, дължина или ъгъл, но запазват колинеарността и честотата, колинеарността означава, че двете точки лежат на една права линия.
Неафинните трансформации са много често срещани в компютърното зрение и се генерират от различни ъгли на камерата. Неафинните или проективните трансформации се наричат още хомография.
2. Преводи на изображения - Преместване на изображението нагоре, надолу, наляво и надясно
Преводът на изображения премества изображението нагоре, надолу, наляво и надясно и дори по диагонал, ако внедряваме x и y превод едновременно.
Сега за извършване на преводи на изображения използваме функцията warpAffine на opencv, cv2.warpAffine се използва за реализиране на тези преводи, но за това се нуждаем от матрица за превод.
Матрица за превод, T = 1 0 Tx
0 1 ти
T X, T y са посоките, в които се извършва изместването на изображението.
При което T X е изместване по оста X (хоризонтално)
T Y е изместване по оста Y (вертикално)
# това е афинна трансформация, която просто измества позицията на изображение # използваме cv2.warpAffine, за да приложим тези трансформации. import cv2 import numpy as np image = cv2.imread ('input.jpg') # съхранява височината и ширината на височината на изображението , width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (изображение, T, (ширина, височина)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Превод ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Конзолен изход - (183, 275) - височина и ширина
- Т матрица
]
3. Завъртане на изображението - завъртане на изображението
Въртене на изображението е завъртане на изображение около точка или точката в центъра на изображението, точно както въртящата се точка действа като ос.
Тъй като в превод имаме Т матрица, вероятно при въртене имаме М матрица
Матрица на въртене, М матрица = Cosθ-Sinin
Sinθ Cosθ
Където θ е ъгълът на въртене, измерен в посока, обратна на часовниковата стрелка.
Също така има едно нещо, което трябва да се отбележи, че OpenCV ви позволява да продавате и завъртате изображение едновременно с помощта на функцията, cv2.getRotationMatrix2D (rotacija_center_x , rotacija_center_y, ъгъл на завъртане, мащаб)
Все още използваме функцията warpAffine на opencv, за да получим завъртането на изображението, но вместо матрица за превод, както в предишния случай тук, използваме матрицата за въртене.
внос CV2 numpy внос като NP изображение = cv2.imread ("input.jpg") височина, ширина = image.shape #divide височината и ширината от 2 за да завъртите изображението за него е център rotation_matrix = cv2.getRotationMatrix2D ((ширина / 2, височина / 2), 90,1) rotated_image = cv2.warpAffine (изображение, въртене_матрица, (ширина, височина)) cv2.imshow ('оригинално изображение', изображение) cv2.waitKey (0) cv2.imshow ('завъртяно изображение ', завъртяно_изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
Сега изображението се завърта на 90 градуса, то се изрязва поради размера на платното, тъй като размерът на платното остава същият, но поради въртене размерът на изображението не се вписва в размера на платното. Може да се регулира чрез задаване на коефициента на мащабиране на отрицателен, но позволява черен фон зад изображението.
Така че можете да зададете височината и ширината на изображението, като го предвидите или отгатнете, или има друг метод за завъртане на изображението, като го транспонирате, но той ще завърти изображението с кратните 90 градуса в посока, обратна на часовниковата стрелка.
4. Мащабиране, преоразмеряване и интерполация
Мащабирането и преоразмеряването са афинични трансформации, преоразмеряването на изображението е това, което сме направили доста време и сме се справили и с интерполация, като например когато преоразмерявате изображението до по-голям размер, в който разширяваме пикселите, има някои пропуски в пиксели и там идва интерполацията.
Това може да се случи при увеличаване на размера на изображението от по-малък на по-голям или намаляване на размера на изображението от по-голям на по-малък.
Технически интерполацията е метод за изграждане на нови точки от данни (пиксели), в рамките на дискретен набор от известни точки от данни.
Има различни видове методи за интерполация в OpenCV като
cv2.INTER_AREA - добро за свиване или вземане на проби
cv2.INTER_NEAREST - най-бързо
cv2.LINEAR - добро за мащабиране или вземане на проби (по подразбиране)
cv2.CUBIC - по-добре
cv2.INTER_LANCZOS4 - най-добрият
# преоразмеряването е много лесно с помощта на функцията cv2.resize, нейните аргументи са # cv2.resize (изображение, dsize (размер на изходното изображение), x_scale, y_scale, интерполация) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # нека направим изображението 3/4 с оригиналния размер на изображението, т.е. намалява до 75% image_scaled = cv2.resize (изображение, Няма, fx = 0.75, fy = 0.75) # тъй като линейната интерполация е метод по подразбиране за отворен cv, не е необходимо да го прилагаме като функция. cv2.imshow ('мащабираща_линейна интерполация', image_scaled) cv2.waitKey (0) # нека удвоим размера на нашето изображение img_double = cv2.resize (изображение, Няма, fx = 2, fy = 2, интерполация = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # нека направим преоразмеряването с точни размери image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Пирамиди на изображението - Друг начин за преоразмеряване
Пирамидиращото изображение се отнася или до увеличаване на мащаба (уголемяване на изображения) или към намаляване на мащаба (свиване на изображения).
Това е просто различен начин за преоразмеряване, който ни позволява лесно и бързо да мащабираме изображенията, намалявайки намаляването на височината и ширината на новото изображение наполовина.
Това е полезно, когато правите детектори на обекти, които мащабират изображенията всеки път, когато търсят обект.
импортиране на cv2 изображение = cv2.imread ('input.jpg') по-малко = cv2.pyrDown (изображение) по-голямо = cv2.pyrUp (по-малко) cv2.imshow ('оригинал', изображение) cv2.waitKey (0) cv2.imshow ("по-малък", по-малък) cv2.waitKey (0) cv2.imshow ("по-голям", по-голям) cv2.waitKey (0) cv2.destroyAllWindows ()
При по-голямо изображение ще забележите, че все още е със същия размер на оригиналното изображение, което е малко размазано, защото се преобразува от по-малко изображение в по-голямо изображение директно. Но ако го интерполираме, качеството на изображението се подобрява от предишното, тъй като интерполацията оценява пикселите, докато запълва интервалите, когато изображението се увеличава.
Сега изпълняването на същия код, но с кубична интерполация, дава по-добро качество на голямо изображение. Под изображенията е показано сравнението между оригиналното изображение, увеличената версия на изображението, по-малкото изображение и кубичната интерполирана версия на по-малкото изображение.
импортиране на cv2 изображение = cv2.imread ('input.jpg') по-малко = cv2.pyrDown (изображение) по-голямо = cv2.pyrUp (по-малко) cv2.imshow ('оригинал', изображение) cv2.waitKey (0) cv2.imshow ("по-малък", по-малък) cv2.waitKey (0) cv2.imshow ("по-голям", по-голям) cv2.waitKey (0) # повишаване на качеството на преобразуваното по-голямо изображение от по-малко изображение с помощта на кубична интерполация img_double = cv2.resize (по-малък, Няма, fx = 2, fy = 2, интерполация = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
ЗАБЕЛЕЖКА: Ако искате да създадете множество малки копия на изображения, които стават по-малки и по-малки по размер или множество големи копия на изображения, непрекъснато нарастващи по размер, тогава можем да използваме за цикли или докато цикли се съхраняват във функцията pyrDown или pyrUp .
6. Изрязване - Изрязване на областта на изображението, което искате
Изрязването на изображения се отнася до извличане на сегмент от изображение.
OpenCV директно нямат функция за изрязване, но това може лесно да бъде направено чрез numpy, използвайки кода по-долу
Подрязано = изображение
Поставяме масива от изображения и използвайки инструменти за индексиране или метод в numpy, дефинираме начален ред до краен ред и начална колона до крайна колона, разделени със запетая, която извлича правоъгълника, който искаме да изрежем, за да получим изображението.
import cv2 import numpy като np image = cv2.imread ('input.jpg') височина, ширина = image.shape # нека вземем началните координати на пиксела (горе вляво на правоъгълника за изрязване) start_row, start_col = int (височина *.25), int (width *.25) # нека вземем крайни пикселни координати (долу вдясно) end_row, end_col = int (височина *.75), int (width *.75) # просто използвайте индексиране, за да изрежете правоъгълника, който желаем изрязан = изображение cv2.imshow ("оригинално изображение", изображение) cv2.waitKey (0) cv2.imshow ("изрязано изображение", изрязано) cv2.waitKey (0) cv2.destroyAllWindows ()
Имайте предвид, че можете да използвате пикселни стойности директно вместо start_col или start_row , те просто са дадени, за да получат лесното идентифициране на потребителя.
7. Аритметични операции за осветяване и потъмняване на изображения
Аритметичните операции в OpenCV основно са добавяне или изваждане на матрици към изображението, добавянето или изваждането на матрици има ефект върху увеличаване или намаляване на яркостта.
Така че, за да добавяме или изваждаме матрици, трябва да ги създадем и numpy има функция, наречена np.ones, която дава матрици с размер 1 като на нашето изображение.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # създайте матрица на нечия , след това я умножете по скалер от 100 ' # np.ones дава матрица със същото измерение като на нашето изображение с всички стойностите са 100 в този случай M = np.ones (image.shape, dtype = "uint8") * 100 # използваме това, за да добавим тази матрица M към нашето изображение # забележи увеличението на яркостта добавена = cv2.add (изображение, M) cv2.imshow ("Добавено", добавено) cv2.waitKey (0) # по същия начин също можем да извадим # забележим намаляването на яркостта извадено = cv2.subtract (изображение, M) cv2.imshow ("извадено", извадено) cv2.waitKey (0) cv2.destroyAllWindows ()
Ето как OpenCV може да се използва за прилагане на много различни операции по обработка на изображения върху изображението. Ще продължим с други функции за манипулиране на изображения в следващия урок.