空域滤波(线性平滑滤波器、线性锐化滤波器、非线性平滑滤波器、非线性锐化滤波器)
(1)算法原理
空域滤波和空域滤波器的定义使用空域模板进行的图像处理,被称为空域滤波。模板本身被称为空域滤波器。
1)线性平滑滤波器
包含在滤波器邻域内像素的平均值,也称为均值滤波器。作用(1)减小图像灰度的“尖锐”变化,减小噪声2)由于图像边缘是由图像灰度尖锐变化引起的,所以也存在边缘模糊的问题。
下图是两个卷积模板。
用cv2.blur(img,ksize) 实现
img:原图像
ksize:核大小
原理:它只取内核区域下所有像素的平均值并替换中心元素。3x3标准化的盒式过滤器如下所示:
2)非线性平滑滤波器
基于滤波器所在图像区域中像素的排序,由排序结果决定的值代替中心像素的值。
分类(1)中值滤波器:用像素领域内的中间值代替该像素。(2)最大值滤波器:用像素领域内的最大值代替该像素。(3)最小值滤波器:用像素领域内的最小值代替该像素。
以中值滤波器为例
中值滤波器是用模板区域内像素的中间值,作为结果值
公式:R=mid{zk|k=1,2,…,n}
强迫突出的亮点或暗点更象它周围的值,以消除孤立的亮点或暗点。
3)线性锐化滤波器
邻域平均或加权平均(都对应积分)可以平滑图像,反过来利用对应微分的方法可以对图像进行锐化滤波。最简单的锐化滤波器是线性锐化滤波器。
线性锐化滤波器也可用模板卷积来实现,但所用模板与线性平滑滤波器的所用模板不同,线性锐化滤波器的模板仅中心系数为正而周围的系数均为负值。对3×3的模板来说,典型的拉普拉斯模板如下图所示。
更为方便的做法是一步完成细节增强,不论中心系数为正还是负,我们合并叠加到原图像这个步骤,使用下面模板
4) 非线性锐化滤波器
锐化滤波器不仅可以是线性的,也可以是非线性的。非线性锐化滤波器常借助对图像微分结果的非线性组合来设计和构造。
1.锐化模板
图像处理中最常用的微分方法是利用梯度(基于一阶微分)。梯度用一个二维列向量来定义
下图是两个常用模板:
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉
import os
import random
import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def sp_noise(noise_img, proportion):
'''
添加椒盐噪声
proportion的值表示加入噪声的量,可根据需要自行调整
return: img_noise
'''
height, width = noise_img.shape[0], noise_img.shape[1]#获取高度宽度像素值
num = int(height * width * proportion) #一个准备加入多少噪声小点
for i in range(num):
w = random.randint(0, width - 1)
h = random.randint(0, height - 1)
if random.randint(0, 1) == 0:
noise_img[h, w] = 0
else:
noise_img[h, w] = 255
return noise_img
def put(path):
image = cv2.imread(path, 1)
original_img = cv2.imread(path, 1)
image = sp_noise(image,0.025)
# 线性平滑滤波
ls_img = cv2.blur(image, (5, 5))
# 线性锐化滤波
kernel_sharpen_1 = np.array([
[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
lr_img = cv2.filter2D(image, -1, kernel_sharpen_1)
# 非线性平滑滤波
nls_img = cv2.medianBlur(image, 5)
# 非线性锐化滤波
nlr_img = cv2.bilateralFilter(image, 5, 31, 31)
# 画图
fig = plt.figure()
ax1 = fig.add_subplot(231)
ax1.imshow(cv2.cvtColor(original_img, cv2.COLOR_BGR2RGB))
ax1.title.set_text('原图')
ax2 = fig.add_subplot(232)
ax2.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
ax2.title.set_text('加椒盐噪声图')
ax3 = fig.add_subplot(233)
ax3.imshow(cv2.cvtColor(ls_img, cv2.COLOR_BGR2RGB))
ax3.title.set_text('线性平滑滤波')
ax4 = fig.add_subplot(234)
ax4.imshow(cv2.cvtColor(nls_img, cv2.COLOR_BGR2RGB))
ax4.title.set_text('非线性平滑滤波')
ax5 = fig.add_subplot(235)
ax5.imshow(cv2.cvtColor(lr_img, cv2.COLOR_BGR2RGB))
ax5.title.set_text('线性锐化滤波')
ax6 = fig.add_subplot(236)
ax6.imshow(cv2.cvtColor(nlr_img, cv2.COLOR_BGR2RGB))
ax6.title.set_text('非线性锐化滤波')
# plt.savefig('4.new.jpg')
plt.show()
# 处理函数,要传入路径
put(r'../image/image3.jpg')