空域平滑

 戳这里观看视频

 

加性噪声:可加性噪声,一般易于消除

乘性噪声:非线性引入的噪声,往往与信号密切相关

量化噪声:模拟信号转化到数字信号时取整变化产生的误差

注意template左上角的1后面有个黑点,代表运算的结果后赋给这个对应点。

一般噪声的像素与周围的像素都明显不同。


instance:

(1)cv.filter2D函数说明

使用自定义内核对图像进行卷积。该功能将任意线性滤波器应用于图像。支持就地操作。当光圈部分位于图像外部时,该功能会根据指定的边框模式插入异常像素值。

dst=cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
参数 描述
src 原图像
dst 目标图像,与原图像尺寸和通道数相同
ddepth 目标图像的所需深度
kernel 卷积核(或相当于相关核),单通道浮点矩阵;如果要将不同的内核应用于不同的通道,请使用拆分将图像拆分为单独的颜色平面,然后单独处理它们。
anchor 内核的锚点,指示内核中过滤点的相对位置;锚应位于内核中;默认值(-1,-1)表示锚位于内核中心。
detal 在将它们存储在dst中之前,将可选值添加到已过滤的像素中。类似于偏置。
borderType 像素外推法,参见BorderTypes

Note:当ddepth=-1时,表示输出图像与原图像有相同的深度。

(2)cv.blur()函数说明

blur()函数可以用标准化的盒式过滤器来平滑图像。

blur的作用是对输入的图像src进行均值滤波后用dst输出。

(3)cv.GaussianBlur函数说明

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。

参数:dst=GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])
src:输入图像;图像可以具有任意数量的通道,这些通道可以独立处理,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
dst:输出图像的大小和类型与src相同。
ksize:高斯内核大小。 ksize.width和ksize.height可以不同,但​​它们都必须为正数和奇数,也可以为零,然后根据sigma计算得出。
sigmaX :X方向上的高斯核标准偏差。
sigmaY: Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。

(4)cv.medianBlur函数说明

 medianBlur() 执行中值滤波操作,中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替 。

dst=cv.medianBlur(src,ksize,dst=None)

ksize滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……

该函数使用具有ksize*ksize孔径大小的中值滤波器来平滑图像。

(5)cv.bilateralFilter函数说明

参数:

d:像素的邻域直径。

sigmaColor:颜色空间的标准方差.

sigmaSpace:坐标空间的标准方差(像素单位)

program

# -*- coding:utf-8
# opencv read image is BGR channel,and matplot read is RGB

import cv2 as cv
import numpy as np
img = cv.imread("/home/image/Pictures/lena_salt.jpg",0)
(H,W) =img.shape

def display(title,imagenum,files):
    cv.namedWindow(title, 0)
    cv.resizeWindow(title,imagenum*W,H)
    cv.imshow(title, np.hstack(files))


def filtter2d(img):#类似卷积
    fil1 = np.array([[ -1,-1, 0],
                     [ -1, 0, 1],
                     [ 0, 1, 1]])
    res = cv.filter2D(img,-1,fil1)#CV自带的图像平滑方法
    files =[img,res]
    display('3X3 filter2d',files.__len__(),files)
    cv.waitKey(0)
    fil2 = np.ones((5,5),np.float32)/25
    dst = cv.filter2D(img,-1,fil2)
    files =[img,dst]
    display('5X5 filter2d',files.__len__(),files)
    cv.waitKey(0)

def  blur(img):#均值滤波
    template1 =(3,5)
    blurs = cv.blur(img,template1)
    files = [img, blurs]
    display('3X5 blur',files.__len__(),files)
    cv.waitKey(0)

def gaussiuan(img):#高斯滤波
    imgg = np.zeros(img.shape,np.uint8)
    imgg[:] = img[:]
    for i in range(1000):
        temp_x = np.random.randint(0, img.shape[0])
        temp_y = np.random.randint(0, img.shape[1])
        imgg[temp_x][temp_y] = 255
    blur = cv.GaussianBlur(imgg,ksize=(5,5),sigmaX=0)
    files = [img, imgg,blur ]
    display('Gaussi blur', files.__len__(), files)
    cv.waitKey(0)

def middenblur(img):#中值滤波
    imgg = np.zeros(img.shape,np.uint8)
    imgg[:] = img[:]
    for i in range(3000):
        temp_x = np.random.randint(0, img.shape[0])
        temp_y = np.random.randint(0, img.shape[1])
        imgg[temp_x][temp_y] = 255
    blur = cv.medianBlur(imgg,7)
    files = [img, imgg,blur ]
    display('middian blur', files.__len__(), files)
    cv.waitKey(0)

def bilateralFilter(img):
    imgg = np.zeros(img.shape,np.uint8)
    imgg[:] = img[:]
    for i in range(5000):
        temp_x = np.random.randint(0, img.shape[0])
        temp_y = np.random.randint(0, img.shape[1])
        imgg[temp_x][temp_y] = 255
    blur = cv.bilateralFilter(imgg,9,75,75,)
    files = [img, imgg,blur ]
    display('bilateralFilter blur', files.__len__(), files)
    cv.waitKey(0)


if __name__ == '__main__':
    filtter2d(img)
    blur(img)
    gaussiuan(img)
    middenblur(img)
    bilateralFilter(img)

运行结果:

戳这里下载原图,自己体会。

发布了94 篇原创文章 · 获赞 134 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_44593822/article/details/104811206