Opencv中常见的滤波方法
滤波(模糊)的概念和作用:
图像滤波增强处理实质上就是运用滤波技术来增强图像的某些空间频率特征,以改善地物目标与领域或背景之间的灰度反差。
遥感系统成像过程中可能产生的”模糊”作用,常使遥感图像上某些用户感兴趣的线性形迹、纹理与地物边界等信息显示得不够清晰,
不易识别。需要通过采用领域处理方法来分析、比较和调整像元与其周围相邻像元间的对比度关系,图像才能得到增加,也就是说
需要采用滤波增加技术处理。
一、空域滤波:使用空域卷积模板进行的图像处理,模板本身被称为空域滤波器
1.线性滤波器:
是线性系统和频域滤波概念在空域的自然延伸。
它包括:低通滤波器(低频的通过):平滑图像,去除噪音
高通滤波器:边缘增强,边缘提取
带通滤波器:删除特定频率
2.非线性滤波器:使用模板进行结果像素值的计算时,结果值直接取决于像素领域的值,而不使用加权和的计算方式
它包括:中值滤波:平滑图像,去除噪音
最大值滤波:寻找最亮点
最小值滤波:寻找最暗点
平滑滤波器的主要用途:降低噪音,对大图像处理前,删去无用的细小细节,平滑处理,恢复过分的锐化的图像,图像创艺
几种简单的低通滤波器:
均值滤波器:待处理像素点的值,等于其一定大小的领域内全体像素的平均值
加权平均滤波器:待处理像素点的输出值,等于其周围相邻像素的全体像素的加权平均值
中值滤波器:用模板区域内象素的中值,作为结果值。消除孤立的亮点(暗点),抑制噪声,可以比较好地保留边缘轮廓信息和图像的细节
锐化滤波器:增强图像中景物的边缘和轮廓,印刷中的细微层次强调,军事目标识别、定位等
它包括:
基本高通滤波器:在增强了边缘的同时,丢失了图像的层次和背景亮度。能够增强图像中的小尺度地物特征。
高增益滤波器:在增强图像的边缘和细节的同时,保持了原图像的低频成分。即增强了边缘又保留了层次,但在增强了边缘的同时也增强了噪音。
微分滤波器:直接使用,与高通类似。有两种特殊应用:梯度大于25,赋255,否则赋原值,图象中的边缘信息被突出,
背景保留。大于25,赋最大值255,否则为零,图像中的边缘信息被突出,同时图像也被二值化。
二、频域滤波:
低通滤波:
理想低通滤波器(ILPF)
Butterworth低通滤波器(BLPF)
指数抵通滤波器(ELPF)
梯形低通滤波器(TLPF)
高通滤波:
理想高通滤波器(IHPF)
Butterworth高通滤波器(BHPF)
指数高通滤波器(EHPF)
梯形高通滤波器(THPF)
带通/带阻滤波器:带通允许一定频率范围内的信号通过而阻止其他频率范围内的信号通过。
代码如下:
#!usr/bin/python
# coding=utf-8
import cv2
import random
import copy
import numpy as np
path = r"C:\Users\Administrator\Desktop\00001.jpg"
or_img = cv2.imread(path)
re_img = cv2.resize(or_img, (500, 300))
width = re_img.shape[0]
height = re_img.shape[1]
channel = re_img.shape[2]
cv2.imshow("re_img...",re_img)
cv2.waitKey(2000)
# 加噪声
per = 0.1 # 噪声占比
N_img = re_img.copy()
N_num = int(per * width * height)
print("N_num",N_num)
for i in range(N_num):
rows = np.random.randint(0, width-1)
cols = np.random.randint(0, height -1)
channel = np.random.randint(0,3)
if np.random.randint(0,2) == 0:
N_img[rows,cols,channel] = 0
else:
N_img[rows, cols, channel] = 255
cv2.imshow("N_img",N_img)
cv2.waitKey(3000)
# 中值滤波
medianBlur = cv2.medianBlur(N_img, 5)
# medianBlur(src, ksize[, dst]) -> dst
cv2.imshow("medianBlur",medianBlur)
cv2.waitKey(3000)
cv2.imwrite("./medianBlur.jpg",medianBlur)
# 均值滤波
Blur = cv2.blur(N_img, (5, 5))
# blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst
cv2.imshow("Blur",Blur)
cv2.waitKey(3000)
cv2.imwrite("./Blur.jpg",Blur)
# 高斯滤波
GaussianBlur = cv2.GaussianBlur(N_img, (5, 5), 0)
# GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
cv2.imshow("GaussianBlur",GaussianBlur)
cv2.waitKey(3000)
cv2.imwrite("./GaussianBlur.jpg",GaussianBlur)
# 高斯双边滤波
GaussianbilateralFilter = cv2.bilateralFilter(N_img, 40, 75, 75)
# bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst
cv2.imshow("GaussianbilateralFilter",GaussianbilateralFilter)
cv2.waitKey(3000)
cv2.imwrite("./GaussianbilateralFilter.jpg",GaussianbilateralFilter)
# boxFilter
boxFilter = cv2.boxFilter(N_img, -1, (5,5), normalize=1)
# boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) -> dst
cv2.imshow("boxFilter",boxFilter)
cv2.waitKey(3000)
cv2.imwrite("./boxFilter.jpg",boxFilter)