zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    STM32驱动TEA5767收音机模块
    stm32驱动DS1302芯片
    NRF24L01无线通讯模块驱动
    MQ-2烟雾传感器启动
    HCSR04超声波传感器驱动
    RDA5820收音机芯片驱动
    SD卡初始化以及命令详解
    STM32硬件IIC操作
    STM32驱动MPU6050
    BMP085气压传感器驱动
  • 原文地址:https://www.cnblogs.com/ywheunji/p/10987749.html
Copyright © 2011-2022 走看看