> 文档中心 > 计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】

计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】

计算机视觉滤波器实操

  • 基础知识
    • 一、 计算机视觉技术中常见的几种滤波器
    • 二、滤波器相关知识
  • 应用一:算术均值、几何均值、谐波逆谐波
    • 一、问题分析
    • 二、结果图
    • 三、代码附录
  • 应用二:维纳滤波,逆滤波
    • 一、问题分析
    • 二、结果图
    • 三、代码

基础知识

一、 计算机视觉技术中常见的几种滤波器

1.理想的低通滤波器
其中,D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离,很简单就能得到。
使用低通滤波器所得到的结果如下所示。低通滤波器滤除了高频成分,所以使得图像模糊。由于理想低通滤波器的过度特性过于急峻,所以会产生了振铃现象。

2.巴特沃斯低通滤波器
同样的,D0表示通带的半径,n表示的是巴特沃斯滤波器的次数。随着次数的增加,振铃现象会越来越明显。

3.高斯低通滤波器
D0表示通带的半径。高斯滤波器的过度特性非常平坦,因此是不会产生振铃现象的。
4.维纳滤波
5.算术均值滤波
6.几何均值滤波

二、滤波器相关知识

一、概述

1.定义
凡是可以使信号中特定的频率成分通过,而极大地衰减或抑制其他频率成分的装置或系统都称之为滤波器,相当于频率“筛子”。

2.分类
幅频特性如下
频率通带:能通过滤波器的频率范围
频率阻带:被滤波器抑制或极大地衰减的信号频率范围。
截止频率:通带与阻带的交界点。

2)按物理原理分:机械式、电路式

按处理信号分:模拟、数字

3.滤波器的作用
1)将有用的信号与噪声分离,提高信号的抗干扰性及信噪比;
2)滤掉不感兴趣的频率成分,提高分析精度;
3)从复杂频率成分中分离出单一的频率分量。

二、理想滤波器与实际滤波器

1.理想滤波器的频率特性
理想滤波器:使通带内信号的幅值和相位都不失真,阻喧内的频率成分都衰减为零的滤波器,其通带和阻带之间有明显的分界线。
如理想低通滤波器的频率响应函数为
理想滤波器实际上并不存在。

2.实际滤波器
实际滤波器的特性需要以下参数描述:
①信频程选择性:
与上、下截止频率处相比,频率变化一倍频程时幅频特性的衰减量,即
信频程选择性总是小于等于零,显然,计算信量的衰减量越大,选择性越好。
②滤波器因素 :-60dB处的带宽与-3dB处的带宽之比值,即
③分辨力:即分离信号中相邻频率成分的能力,用品质因素Q描述。
3.实际带通滤波器的形式
①恒定带宽带通滤波器:B=常量,与中心频率f0无关。
②恒定百分比带通滤波器:
在高频区恒定百分比带通滤波器的分辨率比恒定带宽带通滤波器差。

三、RC无源模拟式滤波器

1.一阶RC低通滤波器
2.一阶高通滤波器
3.带通滤波器
将RC低通和高通滤波器串联起来,就可以组成RC带通滤波器。

四、数字滤波器简介
数学滤波:通过一定的计算方法和计算程序对离散信号进行加工,将其改造成新要求的。离散信号,有低通、高通、带通、带阻之分。数字滤波是对模拟滤波的一种模拟。如模拟RC低通滤波器。

更加详细的滤波器知识讲解可以参考我的另外一篇博客

链接: [(https://blog.csdn.net/champion564/article/details/124688761?spm=1001.2014.3001.5501).

应用一:算术均值、几何均值、谐波逆谐波

一、问题分析

使用算术均值滤波、几何均值滤波器、谐波滤波器、逆谐波滤波器处理图片,观察不同滤波器处理过后的图片。

二、结果图

原图
计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】
算术均值图
计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】
几何均值图
计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】
谐波均值滤波均值图
计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】

三、代码附录

import numpy as npimport cv2 #算术均值滤波器:def a_mean(img,kernel_size):     G_mean_img = np.zeros(img.shape)    #print(G_mean_img[0][0])     #print(img)    k = int((kernel_size-1)/2)    #print(k)    for i in range(img.shape[0]): for j in range(img.shape[1]):     if i <k or i>(img.shape[0]-k-1) or j <k or j>(img.shape[1]-k-1):  G_mean_img[i][j]=img[i][j]     else:  for n in range(kernel_size):      for m in range(kernel_size):   G_mean_img[i][j] +=np.float(1/(kernel_size*kernel_size)*img[i-k+n][j-k+m])    #G_mean_img[i][j]=1/9*(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+img[i][j-1]+img[i][j]+img[i][j+1]+img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])    G_mean_img = np.uint8(G_mean_img)    return G_mean_img #几何均值滤波器:def G_mean(img,kernel_size):     G_mean_img = np.ones(img.shape)    #print(G_mean_img[0][0])     #print(img)    k = int((kernel_size-1)/2)    #print(k)    for i in range(img.shape[0]): for j in range(img.shape[1]):     if i <k or i>(img.shape[0]-k-1) or j <k or j>(img.shape[1]-k-1):  G_mean_img[i][j]=img[i][j]     else:  for n in range(kernel_size):      for m in range(kernel_size):   G_mean_img[i][j] *=np.float(img[i-k+n][j-k+m])  G_mean_img[i][j] = pow(G_mean_img[i][j],1/(kernel_size*kernel_size))    #G_mean_img[i][j]=1/9*(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+img[i][j-1]+img[i][j]+img[i][j+1]+img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])    G_mean_img = np.uint8(G_mean_img)    return G_mean_img  #谐波均值滤波均值滤波器:def H_mean(img,kernel_size):     G_mean_img = np.zeros(img.shape)    #print(G_mean_img[0][0])     #print(img)    k = int((kernel_size-1)/2)    #print(k)    for i in range(img.shape[0]): for j in range(img.shape[1]):     if i <k or i>(img.shape[0]-k-1) or j <k or j>(img.shape[1]-k-1):  G_mean_img[i][j]=img[i][j]     else:  for n in range(kernel_size):      for m in range(kernel_size):   if img[i-k+n][j-k+m] ==0:G_mean_img[i][j] = 0break   else:G_mean_img[i][j] +=1/np.float(img[i-k+n][j-k+m])      else:   continue      break  if G_mean_img[i][j]!=0:      G_mean_img[i][j] = (kernel_size*kernel_size)/G_mean_img[i][j]    #G_mean_img[i][j]=1/9*(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+img[i][j-1]+img[i][j]+img[i][j+1]+img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])    G_mean_img = np.uint8(G_mean_img)    return G_mean_img  #逆谐波均值滤波均值滤波器:def HT_mean(img,kernel_size,Q):     G_mean_img = np.zeros(img.shape)    #print(G_mean_img[0][0])     #print(img)    k = int((kernel_size-1)/2)    #print(k)     for i in range(img.shape[0]): for j in range(img.shape[1]):     if i <k or i>(img.shape[0]-k-1) or j <k or j>(img.shape[1]-k-1):  G_mean_img[i][j]=img[i][j]     else:  result_top = 0  result_down = 0  for n in range(kernel_size):      for m in range(kernel_size):   if Q>0:result_top +=pow(np.float(img[i-k+n][j-k+m]),Q+1)result_down +=pow(np.float(img[i-k+n][j-k+m]),Q)   else:if img[i-k+n][j-k+m]==0:    G_mean_img[i][j] = 0    breakelse:    result_top +=pow(np.float(img[i-k+n][j-k+m]),Q+1)    result_down +=pow(np.float(img[i-k+n][j-k+m]),Q)      else:   continue      break   else:      if result_down !=0:   G_mean_img[i][j] = result_top/result_down    #G_mean_img[i][j]=1/9*(img[i-1][j-1]+img[i-1][j]+img[i-1][j+1]+img[i][j-1]+img[i][j]+img[i][j+1]+img[i+1][j-1]+img[i+1][j]+img[i+1][j+1])    G_mean_img = np.uint8(G_mean_img)    return G_mean_img  if __name__ == "__main__":     img = cv2.imread('D:\\01.JPG',0)     G_mean_img_3 = HT_mean(img,kernel_size = 3,Q=-1.5)    G_mean_img_5 = HT_mean(img,kernel_size = 5,Q=-1.5)    G_mean_img_9 = HT_mean(img,kernel_size = 9,Q=-1.5)   print(G_mean_img_3.max())     cv2.imshow("show1",img)    cv2.imshow("show2_3",G_mean_img_3)    cv2.imshow("show3_5",G_mean_img_5)    cv2.imshow("show3_9",G_mean_img_9)    cv2.waitKey(0)  print("test_end")  

应用二:维纳滤波,逆滤波

一、问题分析

使用维纳滤波、逆滤波处理图片实现去雾效果,观察不同滤波器处理过后的图片。

二、结果图

左边为原图,右边为经过处理后的效果图
计算机视觉/ python环境下如何用滤波器(/逆滤波/均值滤波/低通滤波/高通滤波)处理图片【附代码】

三、代码

import matplotlib.pyplot as graphimport numpy as npfrom numpy import fftimport mathimport cv2 # 仿真运动模糊def motion_process(image_size,motion_angle):    PSF = np.zeros(image_size)    print(image_size)    center_position=(image_size[0]-1)/2    print(center_position)     slope_tan=math.tan(motion_angle*math.pi/180)    slope_cot=1/slope_tan    if slope_tan<=1: for i in range(15):     offset=round(i*slope_tan)    #((center_position-i)*slope_tan)     PSF[int(center_position+offset),int(center_position-offset)]=1 return PSF / PSF.sum()  #对点扩散函数进行归一化亮度    else: for i in range(15):     offset=round(i*slope_cot)     PSF[int(center_position-offset),int(center_position+offset)]=1 return PSF / PSF.sum() #对图片进行运动模糊def make_blurred(input, PSF, eps):    input_fft = fft.fft2(input)# 进行二维数组的傅里叶变换    PSF_fft = fft.fft2(PSF)+ eps    blurred = fft.ifft2(input_fft * PSF_fft)    blurred = np.abs(fft.fftshift(blurred))    return blurred def inverse(input, PSF, eps):# 逆滤波    input_fft = fft.fft2(input)    PSF_fft = fft.fft2(PSF) + eps #噪声功率,这是已知的,考虑epsilon    result = fft.ifft2(input_fft / PSF_fft) #计算F(u,v)的傅里叶反变换    result = np.abs(fft.fftshift(result))    return result def wiener(input,PSF,eps,K=0.01): #维纳滤波,K=0.01    input_fft=fft.fft2(input)    PSF_fft=fft.fft2(PSF) +eps    PSF_fft_1=np.conj(PSF_fft) /(np.abs(PSF_fft)2 + K)    result=fft.ifft2(input_fft * PSF_fft_1)    result=np.abs(fft.fftshift(result))    return result image = cv2.imread('C:/Users/admin/Desktop/OIP-C.jpg')image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)img_h=image.shape[0]img_w=image.shape[1]graph.figure(1)graph.xlabel("Original Image")graph.gray()graph.imshow(image)     #显示原图像 graph.figure(2)graph.gray()#进行运动模糊处理PSF = motion_process((img_h,img_w), 60)blurred = np.abs(make_blurred(image, PSF, 1e-3)) graph.subplot(231)graph.xlabel("Motion blurred")graph.imshow(blurred) result = inverse(blurred, PSF, 1e-3)   #逆滤波graph.subplot(232)graph.xlabel("inverse deblurred")graph.imshow(result) result=wiener(blurred,PSF,1e-3)     #维纳滤波graph.subplot(233)graph.xlabel("wiener deblurred(k=0.01)")graph.imshow(result) blurred_noisy=blurred + 0.1 * blurred.std() * \    np.random.standard_normal(blurred.shape)   #添加噪声,standard_normal产生随机的函数 graph.subplot(234)graph.xlabel("motion & noisy blurred")graph.imshow(blurred_noisy)      #显示添加噪声且运动模糊的图像 result = inverse(blurred_noisy, PSF, 0.1+1e-3)    #对添加噪声的图像进行逆滤波graph.subplot(235)graph.xlabel("inverse deblurred")graph.imshow(result) result=wiener(blurred_noisy,PSF,0.1+1e-3)   #对添加噪声的图像进行维纳滤波graph.subplot(236)graph.xlabel("wiener deblurred(k=0.01)")graph.imshow(result) graph.show()

更多关于计算机视觉、图像处理这方面的内容将持续更新。
如果以上内容对你有帮助,请点个赞吧。有任何问题和不明白的地方欢迎私信作者或者在评论区留言,谢谢。