zoukankan      html  css  js  c++  java
  • 利用卷积对图像进行模糊处理

    若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()
    
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15138433.html
Copyright © 2011-2022 走看看