空域平滑
加性噪声:可加性噪声,一般易于消除
乘性噪声:非线性引入的噪声,往往与信号密切相关
量化噪声:模拟信号转化到数字信号时取整变化产生的误差
注意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)
运行结果:
戳这里下载原图,自己体会。
上一篇: 淘宝api
下一篇: 邻接多重表C++实现