• 利用卷积对图像进行模糊处理


    若cv.imread('图片路径') 这个图片路径错了,就会报错error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

    详细文章转自该博主博文
    卷积:就是对于某一位置的像素,通过算法来把它附近的所有像素点的值联合起来,重新设置这个像素的大小。(个人理解)

    1.均值模糊函数blur():定义:blur(src,ksize,dst=None, anchor=None, borderType=None)

    定义是有5个参数,但最后三个均为none,所以也就2个参数

    src:要处理的原图像

    ksize: 周围关联的像素的范围:代码中(5,5)就是9*5的大小,就是计算这些范围内的均值来确定中心位置的大小

    2.中值模糊函数medianBlur(): 定义:medianBlur(src, ksize, dst=None)

    ksize与blur()函数不同,不是矩阵,而是一个数字,例如为5,就表示了5*5的方阵

    3.高斯平滑函数GaussianBlur():定义:GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

    sigmaX:标准差

    高斯滤波没有考虑图像的边缘,会将边缘模糊掉。

    4.高斯双边滤波函数bilateralFilter():定义:bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
      d:邻域直径
      sigmaColor:颜色标准差
      sigmaSpace:空间标准差

    通俗理解:当远离边界时,即颜色十分相近,颜色权基本一样时,类似于高斯滤波,这样变可平滑处理图像。当处在边界时(所谓边界,就是颜色反差极大的地方),边界上的点互相颜色相近,会取极大的权值,而边界外的的点,颜色距离很远,权值取的很小(甚重可以忽略不计),这样就保护了边缘(保边去噪)。

    5.均值漂移滤波函数pyrMeanShiftFiltering() :定义:pyrMeanShiftFiltering(sr,sp,sr,ds = None,maxLevel = None, termcrit = None )

    src:输入图像,8位,三通道的彩色图像。
      sp:定义的漂移物理空间半径大小
      sr:定义的漂移色彩空间半径大小

    这个函数让图像在色彩层面平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域。

    6.自定义模糊:使用的函数为:filter2D():定义为filter2D(src,ddepth,kernel)

    ddepth:深度,输入值为-1时,目标图像和原图像深度保持一致

    kernel: 卷积核(或者是相关核),一个单通道浮点型矩阵

    修改kernel矩阵即可实现不同的模糊

    import cv2 as cv
    import numpy as np
    from numpy.lib.type_check import imag
    
    def mo_image(src1):
        #均值模糊  这里需要了解卷积核原理  括号里的数字必须为单数,且数字越大,模糊效果越明显
        src2 = cv.blur(src1,(5,5))
        cv.imshow('blur',src2)
    
    
        # 中值模糊 对椒盐噪声有良好的去噪效果
        src2 = cv.medianBlur(src1,5)
        cv.imshow('medianBlur',src2)
    
        # 高斯模糊
        src2 = cv.GaussianBlur(src1,(5,5),2)
        cv.imshow('GaussianBlur',src2)
    
        # 双边滤波
        src2 = cv.bilateralFilter(src1,5,5,2)
        cv.imshow('bilateralFilter',src2)
    
    
    # 自定义模糊函数
    def zi_image(src1):
        kernel1 = np.ones((5,5),np.float)/25 #自定义矩阵,并防止数值溢出
        src2 = cv.filter2D(src1,-1,kernel1)
    
        # 自定义模糊
        cv.imshow("custom_mean_blur", src2)
        kernel2 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)   #数组里面的数的和为1或0
        src2 = cv.fillter2D(src1,-1,kernel2)
    
        # 锐化,使图像更清晰
        cv.imshow("custom_sharpening", src2)
    
    def clamp(pv):
        if pv > 255:
            return 255
        if pv < 0:
            return 0
        return pv
    
    # 添加噪声
    def gaussian_noise(image):
        h,w,c = image.shape
        for row in range(h):
            for col in range(w):
            # 从0,10之间取三个数
                s = np.random.normal(0,10,3)
                b = image[row,col,0]
                g = image[row,col,1]
                r = image[row,col,2]
                image[row,col,0] = clamp(b+s[0])
                image[row,col,1] = clamp(g+s[1])
                image[row,col,2] = clamp(r+s[2])
        cv.imshow("noise image",image)
    
    
    # 边缘保留滤波(EPF)
    # 高斯双边滤波
    def bilateral_demo(img):
        dst = cv.bilateralFilter(src=img, d=0, sigmaColor=100, sigmaSpace=15)
        '''
        高斯双边模糊,相当于磨皮操作
        src:原图像
        d: 像素的领域直径,可由sigmaColor和sigmaColor计算得到
        sigmaColor: 颜色空间的标准方差,一般越大越好
        sigmaSpace: 坐标空间的标准方差(像素单位),一般越小越好
        '''
        cv.imshow('bilateal_dome', dst)
        kennel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)  # 锐化操作使图像更立体
        dst1 = cv.filter2D(dst, -1, kennel)  # -1 表示和原图一样
        cv.imshow('sharpening_dome', dst1)
    
    # 均值偏移滤波
    def mean_shift_demo(img):
        dst = cv.pyrMeanShiftFiltering(src=img, sp=15, sr=20)
        '''
        均值偏移滤波处理,想当与把图片转油画的操作
        src: 原图像
        sp:空间窗的半径(The spatial window radius)
        sr: 色彩窗的半径(The color window radius)
        通过均值迁移来进行边缘保留滤波有时会导致图像过度模糊
        '''
        cv.imshow('mean_shift_demo', dst)
    
    if __name__ == '__main__':
        '''
        模糊函数mo_image()
        '''
        # src = cv.imread("pic/cat.jpg")
        # cv.namedWindow("original", cv.WINDOW_NORMAL)
        # cv.imshow("original", src)
        # mo_image(src)
        # cv.waitKey(0)
        # cv.destroyAllWindows()
    
        '''
        自定义模糊zi_image()
        '''
        # src = cv.imread("pic/cat.jpg")
        # cv.namedWindow("original", cv.WINDOW_NORMAL)
        # cv.imshow("original", src)
        # zi_image(src)
        # cv.waitKey(0)
        # cv.destroyAllWindows()
    
        '''
        添加噪声gaussian_noise()
        '''
        # src = cv.imread("pic/cat.jpg")
        # cv.namedWindow("original", cv.WINDOW_NORMAL)
        # cv.imshow("original", src)
        # gaussian_noise(src)
        # cv.waitKey(0)
        # cv.destroyAllWindows()
    
        '''
        高斯双边滤波bilateral_demo()
        '''
        # src = cv.imread("data/baboon.jpg")
        # cv.namedWindow("original", cv.WINDOW_NORMAL)
        # cv.imshow("original", src)
        # bilateral_demo(src)
        # cv.waitKey(0)
        # cv.destroyAllWindows()
    
    
        '''
        均值偏移滤波mean_shift_demo()
        '''
        src = cv.imread("pic/bizhi.jpg")
        cv.namedWindow("original", cv.WINDOW_NORMAL)
        cv.imshow("original", src)
        mean_shift_demo(src)
        cv.waitKey(0)
        cv.destroyAllWindows()
    
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    [Flex] Flex 控件&类 的自定义事件添加
    [java]原始类型和其包装类
    [java]解析网络上的xml文件
    [android]用adb操作android模拟器
    [java]优先队列
    [Q&A]为什么在ospf邻居之间确定主从关系?
    [js]jQuery插件开发总结
    [Q&A] 为什么把js脚本放到html页面的底部?
    理解一个简单的网页请求过程
    [js]如何更快的得到图片的高度和宽度
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15138433.html
Copyright © 2020-2023  润新知