图像的几何变换在图像处理中十分重要,尤其是腐蚀膨胀,可以把一些不重要的信息过滤掉。
1、仿射变换
1.1 仿射变换可以理解为线性变换:放大、缩小、移动、旋转等。
1.2 矩阵的线性变换:只要乘上另一个矩阵就可以变换过去。
注:有些变换并不是一步到位,因此需要找到变换矩阵。
1.3 变换矩阵说明
1.4 代码
import cv2
src = cv2.imread('img/1.jpg')
rows, cols, channel = src.shape
# 最后一个[0, 0, 1]被省略
# M = np.float32([[1, 0, 20], [0, 1, 50]]) # x平移20,y平移50
# M = np.float32([[0.2, 0, 0], [0, 0.5, 0]]) # w缩放到0.2,h缩放到0.5
# M = np.float32([[-0.5, 0, cols // 2], [0, 0.5, 0]]) # w=-0.5,左右镜像,w缩放一半;h=0.5,h缩放一半;x方向移动cols//2
# M = np.float32([[1, 0.2, 0], [0.2, 1, 0]])
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.7)
dst = cv2.warpAffine(src, M, (cols, rows))
cv2.imshow('src pic', src)
cv2.imshow('dst pic', dst)
cv2.waitKey(0)
2、透视变换
2.1 透视变换不是线性变换,很多成像的变换都是透视变换
2.2 应用:扭曲的图片拉平
2.3代码
import cv2
import numpy as np
img = cv2.imread("img/2.jpg")
# 三个、四个 或者 五个角当前坐标位置
pts1 = np.float32([[25, 30], [179, 25], [12, 188], [189, 190]])
# 变换后的坐标位置
pts2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]])
# 获得变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (200, 200))
cv2.imshow("src", img)
cv2.imshow("dst", dst)
cv2.waitKey(0)
3、膨胀、腐蚀
3.1 膨胀:必须是二值图;白色区域膨胀
import cv2 as cv
img = cv.imread("img/3.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, ksize=(3, 3))
dst = cv.dilate(img, kernel) # 膨胀
3.2 腐蚀:必须是二值图,白色区域缩小。
import cv2 as cv
img = cv.imread("img/3.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, ksize=(3, 3))
dst = cv.erode(img, kernel) #腐蚀