目录
仿射变换
平移
旋转
倾斜
透视
小结
图像的阈值处理
二值化处理
仿射变换是一种仅在二维平面中发生的几何变形,变换之后的图像仍然可以保持直线的「平直性」和「平行性」,也就是说原来的直线变换之后还是直线,平行线变换之后还是平行线。常见的仿射变换效果如图 7.6 所示,包含平移、旋转和倾斜。
OpenCV 通过 cv2. warpAffine()方法实现仿射变换效果,其语法如下: warpaffine的意思就是仿射变换
dst = cv2.warpAffine(src, M, dsize, flags, borderMode, borderValue)
M也被叫做仿射矩阵,实际上是一个2*3的列表
图像做何种仿射变换,完全取决于M的值,仿射变换输出的图像按照以下公式进行计算:
新 x = 原 x × a + 原 y × b + c 新 y = 原 x × d + 原 y × e + f原x是指原来的矩阵x的值 y同理
M矩阵中的数字采用 32 位浮点格式,可以采用两种方式创建M。
创建一个全是0的M
import numpy as np
M = np.zeros((2, 3), np.float32)
通过设定M的值就可以实现多种仿射效果,下面分别介绍如何实现图像的平移、旋转和倾斜。
平移就是让图像中的所有像素同时沿着水平或垂直方向移动。实现这种效果只需要将M的值按照以下格式进行设置:
M = [[1, 0, 水平移动的距离],[0, 1, 垂直移动的距离]]
让图像旋转也是通过M矩阵实现的,但得出这个矩阵需要做很复杂的运算,于是 OpenCV 提供了 getRotationMatrix2D()方法自动计算旋转图像的M矩阵。getRotationMatrix2D()方法的语法如下:
注意:rotationmatrix的意思就是旋转矩阵
M = cv2.getRotationMatrix2D(center, angle, scale)
OpenCV 需要定位图像的 3 个点来计算倾斜效果,3 个点的位置如图 7.11 所示,这 3 个点分别是「左上角」点A、「右上角」点B和「左下角」点C。OpenCV 会根据这 3 个点的位置变化来计算其他像素的位置变化。因为要保证图像的「平直性」和「平行性」,所以不需要「右下角」的点做第 4 个参数,右下角这个点的位置根据A、B、C 3 点的变化自动计算得出
说明
「平直性」是指图像中的直线在经过仿射变换之后仍然是直线。「平行性」是指图像中的平行线在经过仿射变换之后仍然是平行线。
让图像倾斜也是需要通过M矩阵实现的,但得出这个矩阵需要做很复杂的运算,于是 OpenCV 提供了 getAffineTransform()方法来自动计算倾斜图像的M矩阵。getRotationMatrix2D()方法的语法如下:
如果说仿射是让图像在二维平面中变形,那么透视就是让图像在三维空间中变形。从不同的角度观察物体,会看到不同的变形画面,例如,矩形会变成不规则的四边形,直角会变成锐角或钝角,圆形会变成椭圆,等等。这种变形之后的画面就是透视图。
OpenCV 中需要通过定位图像的 4 个点计算透视效果,4 个点的位置如图 7.16 所示。OpenCV 根据这 4 个点的位置变化来计算其他像素的位置变化。透视效果不能保证图像的「平直性」和「平行性」。
OpenCV 通过 warpPerspective()方法来实现透视效果,其语法如下:
dst = cv2.warpPerspective(src, M, dsize, flags, borderMode, borderValue)
warpperspe 图像透视变换
warpPerspective()方法也需要通过M矩阵计算透视效果,但得出这个矩阵需要做很复杂的运算,于是 OpenCV 提供了 getPerspectiveTransform()方法自动计算M矩阵。getPerspectiveTransform()方法的语法如下:
M = cv2.getPerspectiveTransform(src, dst,)
import cv2
import numpy as np
image=cv2.imread('yu.jpg')
rows=len(image)
cols=len(image[0])
point=np.zeros((4,2),np.float32)
point[0]=[0,0]
point[1]=[cols-1,0]
point[2]=[0,rows-1]
point[3]=[cols,rows]
point1=np.zeros((4,2),np.float32)
point1[0]=[60,0]
point[1]=[cols-60,0]
point[2]=[0,rows-100]
point[3]=[cols-100,rows-100]
M=cv2.getPerspectiveTransform(point,point1)
des=cv2.warpPerspective(image,M,(cols,rows))
cv2.imshow('img',image)
cv2.imshow('dst',des)
cv2.waitKey(0)
cv2.destroyAllWindows()
小结
图像的缩放有两种方式
desize 可以选择用像素值 或者用百分比
图像的翻转有两种方式
fileCode参数可以让图像延x,y或者xy轴进行翻转
图像的仿射变换
通过仿射矩阵进行调节
阈值,可以说是像素的标准线:
所有像素值分为三类 比阈值大,比阈值小,等于阈值
程序通过阈值将像素分组,从而使某组像素加深或变浅
使得图像的轮廓更加的鲜明,更容易被计算机识别
以下是本内容的大纲
在图像处理中 阈值使图像的像素值更单一,使得图像的效果更加简单。
如,将一副彩色图像先变为灰度图像,就可以把像素值堪为0~255之间的像素值
通过阈值使得转换后的灰度图像呈现出只有纯黑色和纯白色的视觉效果。例如,当阈值为 127 时,把小于 127 的所有像素值都转换为 0(即纯黑色),把大于 127 的所有像素值都转换为 255(即纯白色)。虽然会丢失一些灰度细节,但是会更明显地保留灰度图像主体的轮廓。
OpenCV 提供的 threshold()方法用于对图像进行阈值处理,threshold()方法的语法如下:
retval, dst = cv2.threshold(src, thresh, maxval, type)
二值化处理也叫二值化阈值处理,该处理让图像仅保留两种像素值,或者说所有像素都只能从两种值中取值。
进行二值化处理时,每一个像素值都会与阈值进行比较,将大于阈值的像素值变为最大值,将小于或等于阈值的像素值变为 0.
要知后事如何 点个关注呗