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

若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()

努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
原文地址:https://www.cnblogs.com/wkhzwmr/p/15138433.html