- 1. Преобразования изображений - аффинные и неаффинные преобразования
- 2. Перевод изображений - перемещение изображения вверх, вниз, влево и вправо.
- 3. Поворот изображения - вращение изображения.
- 4. Масштабирование, изменение размера и интерполяция
- 5. Пирамиды изображений - еще один способ изменения размера
- 6. Обрезка - вырезание нужной области изображения.
- 7. Арифметические операции по осветлению и затемнению изображений.
В предыдущем уроке мы узнали об OpenCV и выполнили базовую обработку изображений, используя его, например, масштабирование серого, насыщенность цвета, гистограмму, цветовые пространства, компонент RGB и т. Д. Как было сказано в предыдущем уроке, OpenCV - это библиотека Commuter Vision с открытым исходным кодом, которая имеет C ++, Python и Java интерфейсы и поддерживает Windows, Linux, Mac OS, iOS и Android. Таким образом, его можно легко установить в Raspberry Pi в среде Python и Linux. А Raspberry Pi с OpenCV и подключенной камерой можно использовать для создания множества приложений для обработки изображений в реальном времени, таких как обнаружение лиц, блокировка лица, отслеживание объектов, обнаружение автомобильных номеров, система домашней безопасности и т. Д.
В этом уроке мы увидим, как мы собираемся управлять изображением с помощью OpenCV. Здесь мы научимся применять следующую функцию к изображению с помощью OpenCV:
- Преобразования изображений - аффинные и неаффинные преобразования
- Перевод изображений - перемещение изображения вверх, вниз, влево и вправо
- Поворот изображения - вращение изображения
- Масштабирование, изменение размера и интерполяция
- Пирамиды изображений - еще один способ изменения размера
- Обрезка - вырезание нужной области изображения
- Арифметические операции для осветления и затемнения изображений
1. Преобразования изображений - аффинные и неаффинные преобразования
Преобразования - это геометрические искажения, применяемые к изображению, искажения, конечно же, здесь означают не ошибки, а тип коррекции для исправления проблем с перспективой, возникающих в точке, где было снято изображение. Есть два типа преобразований изображений - аффинные и неаффинные.
Аффинные преобразования бывают трех типов: масштабирование, вращение и перенос. Важным моментом в аффинных преобразованиях является то, что линии параллельны до и после преобразования изображения.
Неаффинные преобразования или проективные преобразования не сохраняют параллельность, длину или угол, но сохраняют коллинеарность и инцидентность, коллинеарность означает, что две точки лежат на одной прямой.
Неаффинные преобразования очень распространены в компьютерном зрении и создаются под разными углами камеры. Неаффинные или проективные преобразования также называют гомографией.
2. Перевод изображений - перемещение изображения вверх, вниз, влево и вправо.
Трансляция изображения перемещает изображение вверх, вниз, влево и вправо и даже по диагонали, если мы реализуем трансляцию по осям x и y одновременно.
Теперь для выполнения переводов изображений мы используем функцию opencv warpAffine, cv2.warpAffine используется для реализации этих переводов, но для этого нам нужна матрица перевода.
Матрица перевода, Т = 1 0 Тх
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') # сохраняем высоту и ширину изображения height, width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (image, T, (width, height)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Перевод ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Вывод на консоль - (183, 275) - высота и ширина
- Т-матрица
]
3. Поворот изображения - вращение изображения.
Поворот изображения - это вращение изображения вокруг точки или точки в центре изображения, точно так же, как точка вращения действует как точка поворота.
Так как в переводе у нас есть T матрица, скорее всего в ротации у нас M матрица
Матрица вращения, матрица M = Cosθ -Sinθ
Sinθ Cosθ
Где θ - угол поворота, измеренный против часовой стрелки.
Также следует отметить, что OpenCV позволяет продавать и вращать изображение одновременно с помощью функции cv2.getRotationMatrix2D (Rotation_center_x , Rot_center_y, угол поворота, масштаб)
Мы по-прежнему используем функцию warpAffine opencv для получения поворота изображения, но вместо матрицы перевода, как в предыдущем случае, здесь мы используем матрицу поворота.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # разделите высоту и ширину на 2, чтобы повернуть изображение вокруг его центра rotation_matrix = cv2.getRotationMatrix2D ((width / 2, height / 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 (image, 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 (image, None, fx = 0.75, fy = 0.75) # поскольку линейная интерполяция является методом по умолчанию для open cv, нам не нужно реализовывать ее как функцию. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # давайте удвоим размер нашего изображения img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = 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. Пирамиды изображений - еще один способ изменения размера
Пирамидирование изображения относится либо к масштабированию (увеличение изображений), либо к уменьшению (сжатие изображений).
Это просто другой способ изменения размера, который позволяет нам легко и быстро масштабировать изображения, уменьшая масштаб, уменьшая высоту и ширину нового изображения вдвое.
Это полезно при создании детекторов объектов, которые масштабируют изображения при каждом поиске объекта.
import cv2 image = cv2.imread ('input.jpg') less = cv2.pyrDown (изображение) больше = cv2.pyrUp (меньше) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('меньше', меньше) cv2.waitKey (0) cv2.imshow ('больше', больше) cv2.waitKey (0) cv2.destroyAllWindows ()
На большом изображении вы заметите, что при сохранении того же размера исходного изображения оно немного размыто, потому что оно напрямую конвертируется из меньшего изображения в большее изображение. Но если мы интерполируем его, качество изображения улучшится по сравнению с предыдущим, потому что интерполяция оценивает пиксели при заполнении пробелов при увеличении изображения.
Теперь выполнение того же кода, но с кубической интерполяцией дает лучшее качество большого изображения. На изображениях ниже показано сравнение исходного изображения, увеличенной версии изображения, уменьшенного изображения и кубической интерполированной версии меньшего изображения.
import cv2 image = cv2.imread ('input.jpg') less = cv2.pyrDown (изображение) больше = cv2.pyrUp (меньше) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('меньше', меньше) cv2.waitKey (0) cv2.imshow ('больше', больше) cv2.waitKey (0) # повышение качества преобразованного большего изображения из меньшего изображения с использованием кубической интерполяции img_double = cv2.resize (меньше, Нет, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
ПРИМЕЧАНИЕ. Если вы хотите создать несколько маленьких копий изображений, которые становятся все меньше и меньше по размеру, или несколько больших копий изображений, постоянно увеличивающихся в размере, мы можем использоватьциклы for илициклы while, сохраняющиеся внутри функции pyrDown или pyrUp .
6. Обрезка - вырезание нужной области изображения.
Обрезка изображений относится к извлечению сегмента изображения.
OpenCV напрямую не имеет функции обрезки, но это можно легко сделать с помощью numpy, используя приведенный ниже код
Обрезано = изображение
Мы помещаем массив изображений и, используя инструменты или метод индексирования в numpy, определяем начальную строку до конечной строки и от начального столбца до конечного столбца, разделенных запятой, которая извлекает прямоугольник, который мы хотим обрезать, чтобы получить изображение.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # давайте получим координаты начального пикселя (левый верхний угол прямоугольника обрезки) start_row, start_col = int (height *.25), int (width *.25) # давайте получим координаты конечных пикселей (внизу справа) end_row, end_col = int (height *.75), int (width *.75) # просто используйте индексирование, чтобы вырезать прямоугольник, который мы хотим обрезать = image 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 в данном случае M = np.ones (image.shape, dtype = "uint8") * 100 # мы используем это, чтобы добавить эту матрицу M к нашему изображению # обратите внимание на увеличение яркости added = cv2.add (image, M) cv2.imshow ("Added", added) cv2.waitKey (0) # аналогично мы также можем вычесть # заметить уменьшение яркости вычтено = cv2.subtract (image, M) cv2.imshow ("вычтено", вычтено)) cv2.waitKey (0) cv2.destroyAllWindows ()
Вот как можно использовать OpenCV для применения к изображению множества различных операций обработки изображений. В следующем уроке мы продолжим работу с другими функциями обработки изображений.