Геометрическое преобразование не изменяет значение пикселя изображения, а только перестраивает пиксели на плоскости изображения. Соответствующее геометрическое преобразование может свести к минимуму негативные последствия геометрических искажений, вызванных углом изображения, отношением перспективы и даже самим объективом. Геометрическое преобразование часто используется в качестве этапа предварительной обработки в приложениях для обработки изображений и является одной из основных задач нормализации изображений.
Геометрическое преобразование требует двух частей операций: во-первых, это операции, необходимые для пространственного преобразования, такие как перемещение, масштабирование, вращение и ортогональная проекция и т. д., которые необходимо использовать для представления отношения отображения (пикселя) между выходными данными. изображение и входное изображение; кроме того, также необходимо использовать алгоритм интерполяции оттенков серого, поскольку в соответствии с этим преобразованием пиксели выходного изображения могут отображаться в нецелые координаты входного изображения.
1. Резка картинок
import cv2
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
dst = img[100:200,100:300]
# 从X轴的100px到200px,y轴的100px到300px
cv2.imshow('image',img)
# 剪切前
cv2.imshow('image',dst)
# 剪切后
cv2.waitKey(0)
результат
Во-вторых, смещение изображения
1. Математический принцип сдвига изображения
x, y — конечные координаты картинки (x, y), x0, y0 — исходные координаты картинки, ∆x, ∆y Размер перевода картинки, формула следующая:
Преобразуйте в матрицу следующим образом:
2. Метод реализации opencv
Функция warpAffine преобразует исходное изображение, используя указанную матрицу:
???(X, y) = ???(?11X+ ?12y + ?13, ?21X+ ?22y + ?23)
cv2.warpAffine(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]])
параметр:
- Входное изображение SRC.
- DST выводит изображение того же типа, что и dsize и src. Матрица преобразования M 2 на 3.
- DSIZE Размер выходного изображения.
- flags Комбинация методов интерполяции и необязательный флаг WARP_INVERSE_MAP, который означает, что M является обратным преобразованием (??? → ???).
- Экстраполяция пикселей borderMode; когда borderMode = BORDER_TRANSPARENT, это означает, что пиксели в целевом изображении, соответствующие «выбросам» в исходном изображении, не изменяются этой функцией.
- borderValue Значение, используемое, если граница не изменяется; по умолчанию оно равно 0.
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
matShift = np.float32([[1,0,100],[0,1,200]])
dst = cv2.warpAffine(img,matShift,(height,width))
cv2.imshow('dst',dst)
# 平移图片
cv2.waitKey(0)
результат:
3. Метод реализации Python
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
dst = np.zeros(img.shape,np.uint8)
height = imgInfo[0]
width = imgInfo[1]
for i in range(0,height):
for j in range(0,width-100):
dst[i,j+100]=img[i,j]
cv2.imshow('image',dst)
cv2.waitKey(0)
3. Масштабирование изображения
В компьютере изображения хранятся в виде матрицы, где сначала строки, а затем столбцы. Итак, изображение с шириной × высотой × цветовыми каналами = 480 × 256 × 3 будет храниться в 3D-тензоре размером 256 × 480 × 3. Обработка изображения также рассчитывается по этой идее (в том числе обработка изображения под OpenCV), то есть высота × ширина × цветовой канал.
1. Математические принципы масштабирования изображения
warpAffine() реализует масштабирование, а формула матрицы выглядит следующим образом.
2. Метод реализации opencv
cv2.resize() может обеспечить масштабирование изображения, но API cv2.resize является небольшим исключением. Поскольку входной параметр — это ширина × высота × цветовой канал.
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
параметр:
- источник - исходное изображение
- dst - образ назначения. Когда параметр dsize не равен 0, размер dst равен size, в противном случае его размер необходимо определить в соответствии с размером src, параметрами fx и fy. Тип dst такой же, как и у образа src.
- dsize - размер целевого изображения.
Когда dsize равен 0, его можно рассчитать по следующей формуле:
dsize = Size(round(fxsrc.cols) round(fysrc.rows))
Следовательно, параметр dsize и параметр (fx, fy) не могут быть равны 0 одновременно.- fx - коэффициент масштабирования по горизонтальной оси. Когда он равен 0, формула расчета выглядит следующим образом:
(double) dsize.width/src.cols- fy - масштабный коэффициент по вертикальной оси. Когда он равен 0, формула расчета выглядит следующим образом:
(double) dsize.width/src.cols- интерполяция - метод интерполяции. Есть 5 типов:
- INTER_NEAREST - интерполяция ближайшего соседа
- INTER_LINEAR — метод билинейной интерполяции (по умолчанию)
- INTER_AREA - локальная ресемплинг на основе пикселей (ресамплинг с использованием отношения площади пикселя). Это может быть лучшим подходом для прореживания изображения. Но если изображение увеличено, это похоже на метод ближайшего соседа.
- INTER_CUBIC - кубическая интерполяция на основе соседства 4x4 пикселя
- INTER_LANCZOS4 - интерполяция Ланцоша на основе соседства 8x8 пикселей
Введение в принцип разностного метода: https://blog.csdn.net/chaipp0607/article/details/65658736
# 1 load 2 info 3 resize 4 check
import cv2
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
print(imgInfo)
height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2]
# 1 放大 缩小 2 等比例 非 2:3
dstHeight = int(height*0.5)
dstWidth = int(width*0.5)
#最近临域插值 双线性插值 像素关系重采样 立方插值
dst = cv2.resize(img,(dstWidth,dstHeight))
cv2.imshow('image',dst)
matScale = np.float32([[0.5,0,0],[0,0.7,0]])
dst = cv2.warpAffine(img,matScale,(int(width*0.5),int(height*0.7)))
cv2.imshow('dst2',dst2)
# 图片宽*0.5,高*0.7
cv2.waitKey(0)
результат:
(547, 730, 3)
3. Метод реализации Python
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dstHeight = int(height/2)
dstWidth = int(width/2)
dstImage = np.zeros((dstHeight,dstWidth,3),np.uint8)#0-255
for i in range(0,dstHeight):#行
for j in range(0,dstWidth):#列
iNew = int(i*(height*1.0/dstHeight))
jNew = int(j*(width*1.0/dstWidth))
dstImage[i,j] = img[iNew,jNew]
cv2.imshow('dst',dstImage)
cv2.waitKey(0)
4. Зеркальное отображение изображений
1. Математические принципы зеркалирования изображений
(1) Принцип вертикального флипа
(2) Принцип горизонтального флипа
(3) принцип поворота на 180 градусов
2. Метод реализации opencv
import cv2
import numpy as np
img = cv2.imread('canton02.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
newImgInfo = (height*2,width,deep)
newImgInfo2 = (height,width*2,deep)
newImgInfo3 = (height*2,width*2,deep)
dst = np.zeros(newImgInfo,np.uint8)
# 垂直翻转
cv2.imshow('dst',dst)
for i in range(0,height):
for j in range(0,width):
dst[i,j] = img[i,j]
# x , y=2*h-y-1
dst[height*2-i-1,j] = img[i,j]
cv2.imshow('dst',dst)
# 水平翻转
dst2 = np.zeros(newImgInfo2,np.uint8)
for i in range(0,height):
for j in range(0,width):
dst2[i,j] = img[i,j]
# x=2*w-x-1 , y
dst2[i,width*2-j-1] = img[i,j]
cv2.imshow('dst2',dst2)
# 水平垂直都翻转
dst3 = np.zeros(newImgInfo3,np.uint8)
for i in range(0,height):
for j in range(0,width):
dst3[i,j] = img[i,j]
# x=2*w-x-1 , y=2*h-y-1
dst3[height*2-i-1,width*2-j-1] = img[i,j]
cv2.imshow('dst3',dst3)
cv2.waitKey(0)
4. Преобразование изображения
1. Математические принципы вращения изображения
Как показано на рисунке выше, r — фиксированное расстояние от точки до начала координат, угол θ — это угол между исходным угловым положением точки и горизонтальной линией, а θ — угол поворота. Координатное представление
В полярных координатах исходные координаты точки равны
Уравнение преобразования:
Преобразовать в матрицу:
2. Метод реализации opencv
cv2.getRotationMatrix2D функция
Изображение сначала поворачивается вокруг начала координат, а после поворота центр изображения перемещается в другую позицию.
Центральные точки изображений до и после поворота не находятся в одном и том же положении, чтобы сделать их в одном и том же положении, изображения необходимо перевести снова.
Координата центральной точки изображения после поворота минус координата до поворота является вектором перемещения в матрице преобразования.
getRotationMatrix2D (Point2f center,double angle,double scale)
параметр:
- центрировать центр вращения в исходном изображении
- угол Угол поворота (градусы). Положительное значение указывает на вращение против часовой стрелки (началом координат считается левый верхний угол)
- масштаб Изотропный коэффициент масштабирования.
import cv2
import numpy as np
img = cv2.imread('canton02.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 2*3
matRotate = cv2.getRotationMatrix2D((height*0.5,width*0.5),45,1)# mat rotate 1 center 2 angle 3 scale
#100*100 25
dst = cv2.warpAffine(img,matRotate,(height,width))
cv2.imshow('dst',dst)
cv2.waitKey(0)
Пять, аффинное преобразование изображения
1. Математические принципы аффинного преобразования изображений
Давайте сначала посмотрим на движущуюся картинку, чтобы интуитивно понять, что такое аффинное преобразование.
Аффинное преобразование: произвольное аффинное преобразование может быть представлено путем умножения на матрицу (линейное преобразование) с последующим добавлением вектора (перенос).
Мы можем выразить это с помощью аффинного преобразования:
- Поворот (линейное преобразование)
- Перевод (векторное добавление)
- Операция масштабирования (линейное преобразование)
Аффинное преобразование представляет собой линейное преобразование двумерных координат (x0, y0) в двумерные координаты (x, y), математическое выражение которого выглядит следующим образом:
Соответствующее представление однородной координатной матрицы:
При обработке изображений аффинные преобразования могут применяться для перемещения, масштабирования и поворота двумерных изображений.Подробности см. в разделах выше.
2. Метод реализации opencv
getAffineTransform (источник InputArray, DST InputArray)
параметр:
- InputArray src: три точки, представляющие ввод
- InputArray dstL: три точки, представляющие выходные данные
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#src 3->dst 3 (左上角 左下角 右上角)
matSrc = np.float32([[0,0],[0,height-1],[width-1,0]])
matDst = np.float32([[50,50],[300,height-200],[width-300,100]])
#组合
matAffine = cv2.getAffineTransform(matSrc,matDst)# mat 1 src 2 dst
dst = cv2.warpAffine(img,matAffine,(width,height))
cv2.imshow('dst',dst)
cv2.waitKey(0)