图像平滑是指受传感器和大气等因素的影响,遥感图像上会出现某些亮度变化过大的区域,或出现一些亮点(也称噪声)。这种为了抑制噪声,使图像亮度趋于平缓的处理方法就是图像平滑。图像平滑实际上是低通滤波,平滑过程会导致图像边缘模糊化。
噪声滤除算法可以从设计方法上分为两大类:线性滤波算法、非线性滤波算法
参数说明
src:输入图像,可以是任何通道数的图像,处理时是各通道拆分后单独处理,但图像深度必须是CV_8U, CV_16U, CV_16S, CV_32F 或CV_64F;
ddepth:输出图像深度(请参考《图像表示的相关概念:图像深度、像素深度、位深的区别和关系》),如果目标图像深度和输入图像深度相同,则传值-1,在Python中此时取值None、0效果也一样,注意ddepth在这里必须传值,不能使用默认值。
dst:结果图像,其大小和类型都与输入图像相同;
ksize:卷积核(convolution kernel )矩阵大小,如上概述所述,实际上是相关核(correlation kernel),为一个单通道的浮点数矩阵,如果针对图像不同通道需要使用不同核,则需要将图像进行split拆分成单通道并使用对应核逐个进行处理
anchor:核矩阵的锚点,用于定位核距中与当前处理像素点对齐的点,默认值(-1,-1),表示锚点位于内核中心,否则就是核矩阵锚点位置坐标,锚点位置对卷积处理的结果会有非常大的影响
normalize:核矩阵是否归一化处理的标记,为True进行归一化处理,否则不进行归一化处理,默认值为True
borderType:当要扩充输入图像矩阵边界时的像素取值方法,当核矩阵锚点与像素重合但核矩阵覆盖范围超出到图像外时,函数可以根据指定的边界模式进行插值运算。
过滤器大小:大过滤器(d > 5)非常慢,因此建议在实时应用中使用 d=5,对于需要大量噪声过滤的离线应用,建议使用 d=9。
Sigma 值:为简单起见,您可以将 2 个 sigma 值设置为相同。 如果它们很小(< 10),则滤镜不会有太大的效果,而如果它们很大(> 150),它们会产生非常强烈的效果,使图像看起来“卡通”。
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
img = cv2.imread('1.bmp',cv2.IMREAD_GRAYSCALE)
source = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
#均值滤波
result1 = cv2.blur(source, (5,5))
result2 = cv2.blur(source, (7,7))
#方框滤波
result3 = cv2.boxFilter(source, -1, (5,5), normalize=1)
result4 = cv2.boxFilter(source, -1, (7,7), normalize=1)
#高斯滤波
result5 = cv2.GaussianBlur(source, (3,3), 0)
result6 = cv2.GaussianBlur(source, (15,15), 0)
#中值滤波
result7 = cv2.medianBlur(source, 3)
#高斯双边滤波
result8 =cv2.bilateralFilter(source, 15, 50, 50)
#显示图形
titles = ['Source', 'Blur 5*5', 'Blur 7*7', 'BoxFilter 5*5',
'BoxFilter 7*7', 'GaussianBlur 3*3', 'GaussianBlur 15*15',
'medianBlur', 'bilateralFilter']
images = [source, result1, result2, result3,
result4, result5, result6, result7, result8]
fig = plt.figure(figsize=(10, 10))#设置大小
for i in range(9):
plt.subplot(3,3,i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
fig.savefig('fig.jpg',bbox_inches='tight')
参赛话题:学习笔记