OpenCV常用基本处理函数(4)简单变换,阈值等
几何变换
缩放
1 img=cv2.imread('messi5.jpg') 2 # 下面的 None 本应该是输出图像的尺寸,但是因为后边我们设置了缩放因子 3 # 因此这里为 None 4 res=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC) 5 #OR 6 # 这里呢,我们直接设置输出图像的尺寸,所以不用设置缩放因子 7 height,width=img.shape[:2] 8 res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
旋转
1 img=cv2.imread('messi5.jpg',0) 2 rows,cols=img.shape 3 # 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子 4 # 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题 5 M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
# 第三个参数是输出图像的尺寸中心 dst=cv2.warpAffine(img,M,(2*cols,2*rows))
仿射变换
仿射变换有旋转 (线性变换),平移 (向量加).缩放(线性变换),错切,反转;
仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)
基本步骤是这样的:
1.图像都是由矩阵来表示;
2.得到变换矩阵的几种方法,
(1)cv2.getRotationMatrix2d()得到旋转矩阵或者放缩,
(2)通过点来表示;三个点的和四个点的,cv2.getAffineTransform和cv2.getPerspectiveTransform
这里举一个三个点的例子;
img = cv2.imread('dog.jpg') rows,cols,_ = img.shape points1 = np.float32([[50,50],[200,50],[50,200]]) points2 = np.float32([[10,100],[200,50],[100,250]]) matrix = cv2.getAffineTransform(points1,points2) output = cv2.warpAffine(img,matrix,(cols,rows))
3.变换函数来得到结果图像;
OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换。cv2.warpAffine 接收的参数是2 × 3 的变换矩阵,而 cv2.warpPerspective 接收的参数是 3 × 3 的变换矩阵。
仿射变换一般通过函数cvWrapAffine(src,dst,mat)实现,其中mat是2x3的仿射矩阵,该矩阵可以利用函数cvGetAffineTransform(srcTri,dstTri,mat)得到,其中mat是被该函数填充的仿射矩阵,srcTri和dstTri分别是由三个顶点定义的平行四边形
具体的图像变换解释参考这里:
https://blog.csdn.net/qq_27261889/article/details/80720359
透视变换
透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x’,y’)空间的映射.
相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域
仿射变换是透视变换的一种特殊情况.它把二维转到三维,变换后,再转映射回之前的二维空间
在OpenCV中,透视变换通过函数cvWrapPerspective(src,dst,mat)实现, 与仿射变换不同的是,透视矩阵是一个3x3的矩阵,在计算矩阵时,可利用函数cvGetPerspectiveTransform(srcQuad,dstQuad,mat),由于不再是平行四边形,需要提供四边形的四个顶点
详细讲解在参考这里:
https://blog.csdn.net/flyyufenfei/article/details/80208361
仿射变换可以叫做平面变换,透视变换可以叫做空间变换。
图像阈值
1.简单阈值,通过cv2.threshold来对图像的某些高于或低于一个阈值的像素点进行操作;
这个函数的第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进行分类的阈值。第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。OpenCV提供了多种不同的阈值方法,这是有第四个参数来决定的
2.自适应阈值,
cv2.adaptiveThreshold
当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值
Otsu 二值化
简单来说就是对一副双峰图像自动根据其直方图计算出一个阈值(对于非双峰图像,这种方法得到的结果可能会不理想)
采用高斯核去噪之后,图像变为一个双峰图像,然后再采用otsu二值化处理之后的原噪声图像变成了下面的样子:第一个为简单阈值,第二个为0自适应阈值,第三个加了高斯去噪;
参考自:https://www.cnblogs.com/Undo-self-blog/p/8436389.html