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

 

posted @ 2019-06-07 10:34  you-wh  阅读(880)  评论(0编辑  收藏  举报
Fork me on GitHub