• opencv+python (2)


    21、图像平滑,中值滤波

    让临近的像素按照大小排列,取排列像素集中位于中间位置的值作为中值滤波后的像素值。

    medianBlur函数

    dst=cv2.medianBlur(src,ksize)   src,源文件   ,ksize,核大小,必须是比1大的奇数,如3,5,7等

    r=cv2.medianBlur(o,3)

    22、形态学变换,图像腐蚀

    形态学转换主要针对的是二值图像,图像里只有0和1两个元素的值,0就是黑色的,1就是白色的。所谓的腐蚀,是针对它的前景色,即那些像素点的值为1的像素点,腐蚀的是白色。两个输入对象。对象1:二值原始图像。对象2:卷积核,关键的数组。  卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为1时,其值才为1,否则值为0。

    函数erode

    dst=cv2.erode( src, kernel, iterations )  dst ,处理结果  src,源图像   kernel,卷积核    iterations,迭代次数,默认情况下,迭代次数是1,根据需要可以进行多次腐蚀操作

    kernel=np.ones( (5,5), np.uint8 ) ones表示我们要生成一个里面都是1的5行5列的数组,np.uint8表示数据类型整型

    import cv2

    import numpy as np

    o=cv2.imread("image\erode.bmp",cv2.IMREAD_UNCHANGED)

    kernel=np.ones((5,5),np.uint8)

    erosion=cv2.erode(o,kernel,iterations=9)

    cv2.imshow("original",o)

    cv2.imshow("erosion",erosion)

    23、形态学转换,图像膨胀

    腐蚀操作的逆操作,图像被腐蚀后,去除了噪声,但是会压缩图像。对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原有形状。卷积核的中心点逐个像素扫描原始图像,被扫描到的原始图像中的像素点,当卷积核对应的元素值只要有一个为1时,其值就为1,否则值为0。

    函数dilate

    dst = cv2.dilate( src, kernel, iterations )

    kernel = np.ones((5,5),np.uint8)  np.uint8表示无符号的8位整数,最小值0,最大值是2的8次幂

    dilation = cv2.dilate(o,kernel)

    24、形态学转换,开运算

    先腐蚀,再膨胀,是对原始图像的去掉噪声并保持原有图像不变。开运算( image )=膨胀(  腐蚀( image )  )

    函数morphologyEx,形态学扩展函数,已经封装了不同运算,使用不同参数即可实现对应效果

    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)      opening,开运算结果    img,源图像    cv2.MORPH_OPEN,开运算     kernel卷积核(同前边的腐蚀膨胀卷积核)

    k = np.ones((5,5),np.uint8)

    r = cv2.morphologyEx(o,cv2.MORPH_OPEN,k)

    25、形态学转换,图像闭运算

    先膨胀,后腐蚀,它有助于关闭前景物体内部的小孔,或物体上的小黑点。闭运算( image )=腐蚀(  膨胀( image )  ),卷积核kernel数组越大,效果越明显。

    函数morphologyEx

    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)  cv2.MORPH_CLOSE,闭运算

    k = np.ones((5,5),np.uint8)

    r = cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)

    26、形态学转换,图像梯度

    原始图像,得到原始图像的膨胀图像和原始图像的腐蚀图像,用膨胀图像-腐蚀图像,得到轮廓图像 。 梯度( image )=膨胀( image )-腐蚀( image )

    函数morphologyEx

    result = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)  cv2.MORPH_GRADIENT, 梯度

    k = np.ones((5,5),np.uint8)

    r = cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)

    27、形态学转换,图像礼帽(顶帽tophat)

    礼帽图像=原始图像-开运算图像,得到噪声图像。礼帽( image )= image - 开运算( image )

    函数morphologyEx

    result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)     cv2.MORPH_TOPHAT, 礼帽

    k = np.ones((5,5),np.uint8)

    r = cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)

    28、形态学转换,图像黑帽

    黑帽图像=闭运算图像-原始图像,得到图像内部的小孔,或前景色中的小黑点

    函数morphologyEx      cv2.MORPH_BLACKHAT, 黑帽

    k = np.ones((5,5),np.uint8)

    r = cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)

    29、图像梯度,sobel算子

    计算不同方向的梯度  G = |Gx| + |Gy|

                 -1    0    1                         p1    p2    p3

    Gx   =   -2    0    2            *            p4    p5    p6

                 -1    0    1                         p7    p8    p9

    P5x = (p3-p1) + 2*(p6-p4) + (p9-p7)   右边这一列减去左边这一列,差值越大,说明这是一个边界

                 -1    -2    -1                         p1    p2    p3

    Gy   =   0      0     0            *            p4    p5    p6

                 1      2     1                         p7    p8    p9

    P5y = (p7-p1) + 2*(p8-p2) + (p9-p3)   下边这一列减去上边这一列,差值越大,说明这是一个边界

    整体的梯度值先计算平方和再计算平方根: G=(Gx^2 +Gy^2)开平方根    为了简化直接用  G = |Gx| + |Gy| ,即直接计算两个方向上的梯度的绝对值的和就可以了

    P5sobel = |p5x|+|p5y|,这是针对p5这点的,实际上每一点都是这样去计算的。

    30、图像梯度,sobel算子函数及其使用

    dst = cv2.Sobel( src, ddepth, dx, dy, [ksize] )     ddepth,处理结果图像深度,通常情况下,可以将该参数的值设置为-1,让处理结果与原始图像保持一致。实际操作中,计算梯度值可能会出现负数。通常处理的图像是np.uint8类型,如果结果也是该类型,所有负数会自动截断为0,发生信息丢失。所以,通常计算时,使用更高的数据类型cv2.CV_64F,取绝对值后,再转换为np.uint8(cv2.CV_8U)类型。      dx,x轴方向,计算x方向的边界      dy,y轴方向,计算y方向的边界      ksize,核大小

    水平梯度、边界:某列其右侧像素值与左侧像素值的差值不为零,是边界;其余列,右侧像素值与左侧像素值的差值均为零,不是边界,差值为负数处理为0,为了边界能取到,取绝对值

    垂直梯度、边界:某行其下一行像素值与上一行侧像素值的差值不为零,是边界;其余行,其下一行像素值与上一行像素值的差值均为零,不是边界,差值取绝对值(提示:256色位图中,白色点像素值255,黑色点像素值0)

    vdst = cv2.convertScaleAbs( src [, alpha[, beta]])   #转回unit8,将负数的值取绝对值转换正值,将原始图像src转换为256色位图

    公式:目标图像 = 调整 (原始图像*alpha + beta)alpha是系数,beta是修正值

    计算sobel结果,分别计算dx和dy后相加

    计算y轴方向的梯度,dx=0,dy=1   x轴与之相反。

    白色图像像素255,黑色像素是0。水平梯度上某元素左侧与右侧差值为0则不是边界,差值不为0是边界,边界值为负数处理为0计算不出来,所以边界取绝对值。

    dst = cv2.addWeighted( src,alpha,src2,beta,gamma )  X轴方向的梯度和Y轴方向上的梯度相加

  • 相关阅读:
    install redis and used in golang on ubuntu 14.04
    在ionic项目中使用极光推送实现推送 & 服务器端代码
    安装go 1.5 & 部署
    python 简单计算器
    双指针算法
    python set()去重的底层原理
    python实现单例模式总结
    __str__和__repr的区别
    python反射详解
    python isinstance和issubclass区别
  • 原文地址:https://www.cnblogs.com/lely/p/9230608.html
Copyright © 2020-2023  润新知