空域平滑
加性噪声:可加性噪声,一般易于消除
乘性噪声:非线性引入的噪声,往往与信号密切相关
量化噪声:模拟信号转化到数字信号时取整变化产生的误差
注意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)
原图:
自己运行体会。
期中考试部分解析:
如何去除乘性噪声和泊松噪声?
去除泊松分布:
泊松噪声用haar小波效果不错
# 泊松分布
import pywt#小波分析库
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('03Poisson.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY).astype('float32')
coeffs = pywt.dwt2(gray, 'haar')
CA, (CH, CV, CD) = coeffs
plt.subplot(121)
plt.imshow(CA, 'gray')
plt.title('result')
plt.subplot(122)
plt.imshow(gray, 'gray')
plt.title('original')
plt.show()
图片:
运行结果(效果感人,很赞):
去除乘性噪声:
乘性噪声先转化为加性噪声在用中值滤波效果可以。
乘性噪声:t=s*n.s为原始信号,n为噪声。对t取log酒转化为加性噪声:logt = logs + logn
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('04mutil.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray=np.float32(gray)
log = np.log(gray)#乘性噪声变加性噪声
# blur = cv.GaussianBlur(log, (5, 5), 0)
# blur = cv.blur(log, (3, 3))
blur = cv.medianBlur(log,5)
# blur = cv.bilateralFilter(log,9,75,75)
reverse = np.exp(blur)#取了log再变回去
reverse = np.uint8(reverse)
plt.subplot(221)
plt.imshow(log, 'gray')
plt.title('log')
plt.xticks([]),plt.yticks([])
plt.subplot(222)
plt.imshow(blur, 'gray')
plt.title('blur')
plt.xticks([]),plt.yticks([])
plt.subplot(223)
plt.imshow(reverse, 'gray')
plt.title('result')
plt.xticks([]),plt.yticks([])
plt.subplot(224)
plt.imshow(gray, 'gray')
plt.title('original')
plt.xticks([]),plt.yticks([])
plt.show()
图片:
运行结果:
感叹一句学长tql,我太弱鸡了www