- 1. Трансформація зображення - афінна та неафінна трансформація
- 2. Переклади зображень - переміщення зображення вгору, вниз, вліво та вправо
- 3. Поворот зображення - обертання зображення
- 4. Масштабування, зміна розміру та інтерполяція
- 5. Піраміди зображення - ще один спосіб зміни розміру
- 6. Обрізання - Вирізання потрібної області зображення
- 7. Арифметичні дії для освітлення та затемнення зображень
У попередньому уроці ми дізналися про OpenCV і зробити деякі обробки, використовуючи його як сіре масштабування, насиченість кольору, гістограми, колірні простору RGB, компоненти і т.д. Як сказані в попередньому підручнику основного зображення, OpenCV є Open Source Приміського Бачення Бібліотеки, яка має Інтерфейси C ++, Python та Java та підтримує Windows, Linux, Mac OS, iOS та Android. Тож його можна легко встановити в Raspberry Pi за допомогою середовища Python та Linux. А Raspberry Pi з OpenCV та підключеною камерою можна використовувати для створення багатьох програм обробки зображень у режимі реального часу, таких як виявлення обличчя, блокування обличчя, відстеження об’єктів, виявлення номерного знака автомобіля, система домашньої безпеки тощо.
У цьому посібнику ми побачимо, як ми маніпулюємо зображенням за допомогою OpenCV. Тут ми навчимося застосовувати таку функцію до зображення за допомогою OpenCV:
- Трансформація зображень - афінна та неафінна трансформація
- Переклади зображень - переміщення зображення вгору, вниз, вліво та вправо
- Поворот зображення - обертання зображення
- Масштабування, зміна розміру та інтерполяція
- Піраміди зображень - ще один спосіб зміни розміру
- Обрізання - вирізання потрібної області зображення
- Арифметичні дії для освітлення та затемнення зображень
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. Поворот зображення - обертання зображення
Поворот зображення - це обертання зображення навколо точки або точки в центрі зображення, подібно до того, як точка, що обертається, діє як опорна точка.
Оскільки при перекладі ми маємо матрицю T, швидше за все, маємо матрицю M
Матриця обертання, М матриця = Cosθ -Sinθ
Sinθ Cosθ
Де θ - кут повороту, виміряний проти годинникової стрілки.
Також є одне, на що слід звернути увагу, що OpenCV дозволяє продавати та обертати зображення одночасно за допомогою функції cv2.getRotationMatrix2D (rotacija_center_x , rota_center_y, кут повороту, масштаб)
Ми все ще використовуємо функцію warpAffine opencv, щоб отримати поворот зображення, але замість матриці перекладу, як у попередньому випадку, ми використовуємо матрицю обертання.
import cv2 import numpy як np image = cv2.imread ('input.jpg') висота, ширина = image.shape # розділіть висоту та ширину на 2, щоб повернути зображення навколо його центру rota_matrix = cv2.getRotationMatrix2D ((width / 2, висота / 2), 90,1) rotated_image = cv2.warpAffine (зображення, матриця_повороту, (ширина, висота)) cv2.imshow ('оригінальне зображення', зображення) cv2.waitKey (0) cv2.imshow ('повернене зображення ', rotated_image) 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 (зображення, розмір (розмір вихідного зображення), 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 (image, None, fx = 0,75, fy = 0,75) # оскільки лінійна інтерполяція є методом за замовчуванням для відкритого cv, нам не потрібно реалізовувати це як функцію. 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) # давайте зробимо розмір за точними розмірами image_resize = cv2.resize (image, (200 300), interpolation = cv2.INTER_AREA) cv2.imshow ('масштабування_точний', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Піраміди зображення - ще один спосіб зміни розміру
Пірамідне зображення означає або збільшення масштабу (збільшення зображень), або зменшення масштабу (зменшення зображень).
Це просто інший спосіб зміни розміру, який дозволяє нам легко та швидко масштабувати зображення, зменшуючи масштаб, зменшуючи висоту та ширину нового зображення наполовину.
Це корисно при створенні детекторів об’єктів, які масштабують зображення кожного разу, коли шукають об’єкт.
імпорт cv2 image = 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 image = 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 (ширина *.25) # давайте отримаємо кінцеві піксельні координати (внизу праворуч) end_row, end_col = int (висота *.75), int (ширина *.75) # просто використовуємо індексацію, щоб обрізати прямокутник, який ми хочемо обрізати = зображення cv2.imshow ("оригінальне зображення", зображення) cv2.waitKey (0) cv2.imshow ("обрізане зображення", обрізане) cv2.waitKey (0) cv2.destroyAllWindows ()
Зверніть увагу, що ви можете використовувати значення пікселів безпосередньо замість start_col або start_row , вони просто надаються, щоб отримати легку ідентифікацію користувача.
7. Арифметичні дії для освітлення та затемнення зображень
Арифметичні операції в OpenCV - це в основному додавання або віднімання матриць до зображення, додавання або віднімання матриць впливає на збільшення або зменшення яскравості.
Отже, щоб додати або відняти матриці, ми маємо їх створити, а numpy має функцію, яка називається np.ones, яка дає матриці такого самого розміру, як і наше зображення.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # створи матрицю, а потім помножи її на масштаб 100 ' # np.ones дає матрицю з таким самим розміром, як і наше зображення з усіма значення в цьому випадку складають 100 = mp.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 можна використовувати для застосування багатьох різних операцій обробки зображень до зображення. Ми продовжимо інші функції маніпулювання зображеннями в наступному уроці.