程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Python3与OpenCV图像处理(六)——模糊处理

发布于2019-08-20 11:35     阅读(2307)     评论(0)     点赞(6)     收藏(3)


【参考视频网址:】https://www.bilibili.com/video/av24998616
【参考博客网址:】https://cloud.tencent.com/developer/article/1199372

模糊处理

  • 1 均值模糊(均值滤波)
    这是一个平滑图片的函数,它将一个区域内所有点的灰度值的平均值作为中心点的灰度值(像素值)。像该函数对领域点的灰度值进行权重相加最后设置灰度值,这样的操作又叫卷积,这样的滤波器叫线性滤波器。去除随机噪声
  • 2 中值模糊
    该函数不同于上一个函数,它是非线性滤波器,它是取卷积核区域的中值作为中心点的灰度值。该方法在去除脉冲噪声、斑点噪声(speckle noise)、椒盐噪声(salt-and-pepper noise)、图像扫描噪声的同时又能保留凸图像边缘细节。
    中值滤波与均值滤波比较:
    (1)优势是,在均值滤波器中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响;而在中值滤波其中,噪声成分很难选上,所以几乎不会影响到输出。
    (2)劣势是,中值滤波花费的时间是均值滤波的5倍以上。
    注意:中值滤波虽然可以克服线性滤波器所带来的图像细节模糊,但是在线、尖顶等细节多的图像不宜用中值滤波。
  • 3 自定义模糊(锐化算子kernel)
    锐化就是突出图像细节或者增强图像被模糊的地方,锐化原理就是细节增强,图像的导数就是图像的细节,随着导数阶数升高,能代表的东西也不同。 (这里好像只到了二阶导数)
  • 4 高斯模糊(高斯模糊图片生成)
    高斯模糊又叫高斯滤波:高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
  • 5 高斯双边模糊
    (1)像素值权重的问题(高斯模糊)
    (2)像素值和像素值之间差异的问题(高斯边缘保留滤波)
    如果相差很大,则保留不进行高斯滤波,即不对边缘进行滤波。EPF(边缘保留滤波:像素值之间差距太大,这时就不要高斯滤波,使用边缘保留,此时信息很丰富)
  • 注意:需要在当前目录下创建一个pic文件夹,放ss.jpg图片
import cv2
import numpy as np


# 确保参数在0,255之间
def clamp(num):
    if num > 255:
        num = 255
    elif num < 0:
        num = 0
    else:
        num = num
    return num


# 给图片加上高斯噪声
def gaussian_noise(image):  # 这个地方不要用src,否则会改变blur_demo函数中的值
    h, w, c = image.shape
    image1 = np.ones((h, w, c), dtype=np.uint8)
    for row in range(h):
        # range(2)为[0, 1],实际上是range(0,2,1)
        # range(1, 5, 2)从1开始,2是步数
        for col in range(w):
            s = np.random.normal(0, 20, (3, ))
            # 0表示中心(均值),20表示标准差,20的平方是方差,越大越胖,(3,)shape,表示输出的随机数个数。
            b = image[row, col, 0] + s[0]
            g = image[row, col, 1] + s[1]
            r = image[row, col, 2] + s[2]
            image1[row, col, 0] = clamp(b)
            image1[row, col, 1] = clamp(g)
            image1[row, col, 2] = clamp(r)
    return image1


def blur_demo(src):
    # (1)高斯模糊图片生成
    src_gauss = gaussian_noise(src)
    # 目前存在的问题是:输入src,返回src_gauss,但是src变化成src_guass
    # 解决方法:在gaussian_noise函数中加上:
    # image1 = np.ones((h, w, c), dtype=np.uint8),重新新建了一个变量,这样不改变输入的变量
    cv2.imshow("src_gauss", src_gauss)

    # (2)均值模糊——模糊都是基于卷积
    src_blur_j = cv2.blur(src, (3, 3))  # 卷积核必须为奇数, 轻微模糊(3, 3)
    # dst = cv2.blur(image, (1, 9))
    # (1, 9)相当于卷积核,越大越模糊,垂直方向上模糊;(9, 1)水平方向上模糊,看大的那个值
    cv2.imshow("src_blur_j", src_blur_j)

    # (3)中值模糊
    src_blur_z = cv2.medianBlur(src, 3)
    cv2.imshow("src_blur_z", src_blur_z)

    # (4)自定义模糊(均值模糊)
    kernel = np.ones([5, 5], dtype=np.float32) / 25  # 自定义卷积核算子
    # 一定要记得除以25,这样保证不溢出,否则图象是白色的。
    src_blur_mine = cv2.filter2D(src, -1, kernel=kernel)
    # filter2D():定义为filter2D(src, ddepth, kernel)
    # src原图像, ddepth:深度,输入值为-1时,目标图像和原图像深度保持一致,
    # kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵,修改kernel矩阵即可实现不同的模糊
    cv2.imshow("src_blur_mine", src_blur_mine)

    # (5)锐化模糊
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])  # 中心像素比重5,其他元素为0或者-1
    # 原则:(1)奇数,(2)总和等于1或者等于0,总和为1做增强,总和为0做边缘梯度
    src_blur_sharp = cv2.filter2D(src, -1, kernel=kernel)
    cv2.imshow("src_blur_sharp", src_blur_sharp)

    # (6)高斯模糊
    src_gauss_blur = cv2.GaussianBlur(src_gauss, (5, 5), 0)
    # src_gauss_blur = cv2.GaussianBlur(src_gauss, (0, 0), 5)
    # 很模糊,毛玻璃效果,轮廓还在但是很模糊,没有被平均保留了像素的主要特征(近视)
    # (0, 0)为卷积核大小,15为sigma。如果卷积核为(0,0),则从sigma计算卷积核
    # 反之,sigma为0,则要知道卷积核大小
    # 总之,sigma和卷积核只取一个就行;如果两个都取,那么从忽略sigma
    cv2.imshow("src_gauss_blur", src_gauss_blur)

    # (7)高斯双边模糊
    # EPF(边缘保留滤波:像素值之间差距太大,这时就不要高斯滤波,使用边缘保留,此时信息很丰富)
    src_gauss_bil_blur = cv2.bilateralFilter(src, 0, sigmaColor=30, sigmaSpace=3)
    cv2.imshow("src_gauss_bil_blur", src_gauss_bil_blur)
    # src_gauss_bil_blur = cv2.bilateralFilter(src, 0, sigmaColor=30, sigmaSpace=5)
    # 相同sigmacolor,sigmaspace越大,在"边界"(双边)内模糊的片更大

    # src_gauss_bil_blur = cv2.bilateralFilter(src, 0, sigmaColor=60, sigmaSpace=3)
    # 相同sigmaspace,sigmacolor越大,在"边界"(双边)内更模糊

    # sigmaspace越大,计算量越大,希望它小一些
    # sigmacolor一般取大一些,小的差距模糊掉,越大越模糊

    # (8)均值迁移
    src_shift = cv2.pyrMeanShiftFiltering(src, 10, 10)
    cv2.imshow("src_shift", src_shift)


def main():
    src = cv2.imread("pic/ss.jpg")
    cv2.imshow("src", src)

    # 主函数
    blur_demo(src)

    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107


所属网站分类: 技术文章 > 博客

作者:comeonbady

链接:https://www.pythonheidong.com/blog/article/49119/ce8208a542ba0621d463/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

6 0
收藏该文
已收藏

评论内容:(最多支持255个字符)