数字图像处理[冈萨雷斯版]频率阈滤波实现_理想滤波器_butterworth滤波器_高斯滤波器

本文主要是如何实现,理想低通高通带阻带通滤波器_butterworth低通高通带阻带通滤波器_高斯低通高通带阻带通滤波器,详细理论知识请查阅数字图像处理[冈萨雷斯版]第四章。
本文的程序集合中用到的工具为:Python OpenCV matplotlib Numpy

下面我会一一给出程序以及程序运行的结果,还有将滤波器处理图片的实时效果。
理想低通滤波


import cv2
import numpy as np
import matplotlib.pyplot as plt


img_man = cv2.imread('C:/Python/OpenCV/tom.jpg',0) #直接读为灰度图像

mask = np.zeros(img_man.shape, dtype=np.uint8)
cv2.circle(mask, (int(img_man.shape[1] / 2), int(img_man.shape[0] / 2)), 10, 1, -1)

plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
f1 = np.fft.fft2(img_man)
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('lowpass')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果:
在这里插入图片描述

理想高通滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt


img_man = cv2.imread('C:/Python/OpenCV/tom.jpg',0) #直接读为灰度图像

mask = np.ones(img_man.shape, dtype=np.uint8)
cv2.circle(mask, (int(img_man.shape[1] / 2), int(img_man.shape[0] / 2)), 50, 0, -1)

plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
f1 = np.fft.fft2(img_man)
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('highpass')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果:

butterworth低通滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt


img_man = cv2.imread('C:/Python/OpenCV/tom.jpg',0) #直接读为灰度图像

h, w = img_man.shape[:2]
cx, cy = int(w / 2), int(h / 2)
# 计算以中心为原点坐标分量
u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
# 每个点到中心的距离
dis = np.sqrt(u * u + v * v)
mask = 1 / (1 + np.power(dis / 60, 2 * 1))

plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
f1 = np.fft.fft2(img_man)
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('lowpass')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
butterworth高通滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt


img_man = cv2.imread('C:/Python/OpenCV/tom.jpg',0) #直接读为灰度图像

h, w = img_man.shape[:2]
cx, cy = int(w / 2), int(h / 2)
# 计算以中心为原点坐标分量
u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
# 每个点到中心的距离
dis = np.sqrt(u * u + v * v)
mask =1- 1 / (1 + np.power(dis / 60, 2 * 1))

plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
f1 = np.fft.fft2(img_man)
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('highpass')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
高斯低通滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt


img_man = cv2.imread('C:/Python/OpenCV/tom.jpg',0) #直接读为灰度图像

h, w = img_man.shape[: 2]
cx, cy = int(w / 2), int(h / 2)
u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
dis2 = u * u + v * v
p = -dis2 / (2 * 50**2)
#filt = 1 / (2 * pi * sigma**2) * np.exp(p)
mask = np.exp(p)

plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
f1 = np.fft.fft2(img_man)
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('lowpass')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
高斯高通滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt


img_man = cv2.imread('C:/Python/OpenCV/tom.jpg',0) #直接读为灰度图像

h, w = img_man.shape[: 2]
cx, cy = int(w / 2), int(h / 2)
u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
dis2 = u * u + v * v
p = -dis2 / (2 * 50**2)
#filt = 1 / (2 * pi * sigma**2) * np.exp(p)
mask = 1-np.exp(p)

plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
f1 = np.fft.fft2(img_man)
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('highpass')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
理想带阻滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt

img_man = cv2.imread('C:/Python/OpenCV/girl.jpg',0) #直接读为灰度图像
plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
#--------------------------------

mask = np.ones(img_man.shape,np.uint8)
cv2.circle(mask,(int(img_man.shape[1]/2),int(img_man.shape[0]/2)),100,0,-1)
cv2.circle(mask,(int(img_man.shape[1]/2),int(img_man.shape[0]/2)),50,1,-1)
#--------------------------------
f1 = np.fft.fft2(img_man)	
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('Ideal_BeltResist_Filter')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
理想带通滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt

img_man = cv2.imread('C:/Python/OpenCV/girl.jpg',0) #直接读为灰度图像
plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
#--------------------------------

mask = np.zeros(img_man.shape,np.uint8)
cv2.circle(mask,(int(img_man.shape[1]/2),int(img_man.shape[0]/2)),100,1,-1)
cv2.circle(mask,(int(img_man.shape[1]/2),int(img_man.shape[0]/2)),50,0,-1)
#--------------------------------
f1 = np.fft.fft2(img_man)	
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('Ideal_BeltPass_Filter')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
butterworth带阻滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt

img_man = cv2.imread('C:/Python/OpenCV/girl.jpg',0) #直接读为灰度图像
plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
#--------------------------------

h, w = img_man.shape[:2]
cx, cy = int(w / 2), int(h / 2)
# 计算以中心为原点坐标分量
u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
# 每个点到中心的距离
dis = np.sqrt(u * u + v * v)
mask = 1 / (1 + np.power((dis*60) / (dis**2-60**2), 2 * 1))
#--------------------------------
f1 = np.fft.fft2(img_man)	
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('butterworth_BeltResist_Filter')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
butterworth带通滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt

img_man = cv2.imread('C:/Python/OpenCV/girl.jpg',0) #直接读为灰度图像
plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
#--------------------------------

h, w = img_man.shape[:2]
cx, cy = int(w / 2), int(h / 2)
# 计算以中心为原点坐标分量
u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
# 每个点到中心的距离
dis = np.sqrt(u * u + v * v)
mask = 1-1 / (1 + np.power((dis*60) / (dis**2-60**2), 2 * 1))
#--------------------------------
f1 = np.fft.fft2(img_man)	
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('butterworth_BeltPass_Filter')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
高斯带阻滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt

img_man = cv2.imread('C:/Python/OpenCV/girl.jpg',0) #直接读为灰度图像
plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
#--------------------------------

h, w = img_man.shape[: 2]
cx, cy = int(w / 2), int(h / 2)
u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
dis2 = np.sqrt(u * u + v * v)
p = -((dis2**2-50**2) / (dis2 * 90))**2
#filt = 1 / (2 * pi * sigma**2) * np.exp(p)
mask = 1-np.exp(p)
#--------------------------------
f1 = np.fft.fft2(img_man)	
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('gaussian_BeltResist_Filter')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
高斯带通滤波

import cv2
import numpy as np
import matplotlib.pyplot as plt

img_man = cv2.imread('C:/Python/OpenCV/girl.jpg',0) #直接读为灰度图像
plt.subplot(131),plt.imshow(img_man,'gray'),plt.title('origial')
plt.xticks([]),plt.yticks([])
#--------------------------------

h, w = img_man.shape[: 2]
cx, cy = int(w / 2), int(h / 2)
u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
dis2 = np.sqrt(u * u + v * v)
p = -((dis2**2-50**2) / (dis2 * 80))**2
#filt = 1 / (2 * pi * sigma**2) * np.exp(p)
mask = np.exp(p)
#--------------------------------
f1 = np.fft.fft2(img_man)	
f1shift = np.fft.fftshift(f1)
f1shift = f1shift*mask
f2shift = np.fft.ifftshift(f1shift) #对新的进行逆变换
img_new = np.fft.ifft2(f2shift)
#出来的是复数,无法显示
img_new = np.abs(img_new)
#调整大小范围便于显示
img_new = (img_new-np.amin(img_new))/(np.amax(img_new)-np.amin(img_new))
plt.subplot(132),plt.imshow(img_new,'gray'),plt.title('gaussian_BeltPass_Filter')
plt.xticks([]),plt.yticks([])
plt.subplot(133),plt.imshow(mask,'gray'),plt.title('mask')
plt.xticks([]),plt.yticks([])
plt.show()

运行结果
在这里插入图片描述
以下为各个滤波器的实现及公式:
理想高通滤波器_butterworth高通滤波器_高斯高通滤波器实现

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def ILPF(w, h,radius):
    mask = np.ones([w,h], dtype=np.uint8)
    cv.circle(mask, (int(w / 2), int(h / 2)), radius, 0, -1)
    return mask

def butterworth_Filter(shape, rank, radius):
    """ butterworth filter genreator

    H(u, v) = 1 / (1 + (D(u, v) / radius)^(2 * rank))
    Args:
        shape:  滤波器的形状
        rank:   滤波器阶数
        radius: 滤波器半径
    """
    # 中心位置
    h, w = shape[:2]
    cx, cy = int(w / 2), int(h / 2)
    # 计算以中心为原点坐标分量
    u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
    v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
    # 每个点到中心的距离
    dis = np.sqrt(u * u + v * v)
    filt = 1-1 / (1 + np.power(dis / radius, 2 * rank))
    return filt

def gaussian_Filter(shape, sigma):
    """ Gaussian Low Pass filter
	Args:
		shape: 滤波器形状
		sigma: sigma值(半径)
    H(u, v) = e^(-(u^2 + v^2) / (2 * sigma^2))
    """
    h, w = shape[: 2]
    cx, cy = int(w / 2), int(h / 2)
    u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
    v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
    dis2 = u * u + v * v
    p = -dis2 / (2 * sigma**2)
    #filt = 1 / (2 * pi * sigma**2) * np.exp(p)
    filt = 1-np.exp(p)
    return filt

#x_axis_list=np.array([x for x in range(900)],dtype=np.uint8)
plt.style.use('dark_background')
img_ILPF = ILPF(900, 900, 60)
plt.subplot(231)
plt.imshow(img_ILPF,'gray')
plt.title('lowPassHzTemplate')
middle_ILPF=np.array(img_ILPF[449,[x for x in range(900)]],dtype=np.uint8)
plt.subplot(234)
plt.plot(middle_ILPF)
plt.title('lowPassHzTemplate')
plt.subplot(231)
plt.imshow(img_ILPF,'gray')
plt.title('lowPassHzTemplate')


image_butterworth=butterworth_Filter((900, 900),1, 60)
plt.subplot(232)
plt.imshow(image_butterworth,'gray')
plt.title('butterworth_Filter')
middlw_butterworth =np.array(255*image_butterworth[449,[x for x in range(900)]],dtype=np.uint8) #乘以255是为了便于显示
plt.subplot(235)
plt.plot(middlw_butterworth)
plt.title('butterworth_Filter')

image_Gaussian = gaussian_Filter((900, 900),50)
plt.subplot(233)
plt.imshow(image_Gaussian,'gray')
plt.title('gaussian_Filter')
middle_Gaussian = np.array(255*image_Gaussian[449,[x for x in range(900)]],dtype=np.uint8) 
plt.subplot(236)
plt.plot(middle_Gaussian)
plt.title('gaussian_Filter')
plt.show()

在这里插入图片描述
理想低通滤波器_butterworth低通滤波器_高斯低通滤波器实现

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def ILPF(w, h,radius):
	mask = np.zeros([w,h], dtype=np.uint8)
	cv.circle(mask, (int(w / 2), int(h / 2)), radius, 1, -1)
	return mask

# def ILPF(w, h,radius):
#     mask = np.ones([w,h], dtype=np.uint8)
#     cv.circle(mask, (int(w / 2), int(h / 2)), radius, 0, -1)
#     return mask

def butterworth_Filter(shape, rank, radius):
    """ butterworth filter genreator

    H(u, v) = 1 / (1 + (D(u, v) / radius)^(2 * rank))
    Args:
        shape:  滤波器的形状
        rank:   滤波器阶数
        radius: 滤波器半径
    """
    # 中心位置
    h, w = shape[:2]
    cx, cy = int(w / 2), int(h / 2)
    # 计算以中心为原点坐标分量
    u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
    v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
    # 每个点到中心的距离
    dis = np.sqrt(u * u + v * v)
    filt = 1 / (1 + np.power(dis / radius, 2 * rank))
    return filt

def gaussian_Filter(shape, sigma):
    """ Gaussian Low Pass filter
	Args:
		shape: 滤波器形状
		sigma: sigma值(半径)
    H(u, v) = e^(-(u^2 + v^2) / (2 * sigma^2))
    """
    h, w = shape[: 2]
    cx, cy = int(w / 2), int(h / 2)
    u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
    v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
    dis2 = u * u + v * v
    p = -dis2 / (2 * sigma**2)
    #filt = 1 / (2 * pi * sigma**2) * np.exp(p)
    filt = np.exp(p)
    return filt

#x_axis_list=np.array([x for x in range(900)],dtype=np.uint8)
plt.style.use('dark_background')
img_ILPF = ILPF(900, 900, 60)
plt.subplot(231)
plt.imshow(img_ILPF,'gray')
plt.title('lowPassHzTemplate')
middle_ILPF=np.array(img_ILPF[449,[x for x in range(900)]],dtype=np.uint8)
plt.subplot(234)
plt.plot(middle_ILPF)
plt.title('lowPassHzTemplate')
plt.subplot(231)
plt.imshow(img_ILPF,'gray')
plt.title('lowPassHzTemplate')


image_butterworth=butterworth_Filter((900, 900),1, 60)
plt.subplot(232)
plt.imshow(image_butterworth,'gray')
plt.title('butterworth_Filter')
middlw_butterworth =np.array(255*image_butterworth[449,[x for x in range(900)]],dtype=np.uint8) #乘以255是为了便于显示
plt.subplot(235)
plt.plot(middlw_butterworth)
plt.title('butterworth_Filter')

image_Gaussian = gaussian_Filter((900, 900),50)
plt.subplot(233)
plt.imshow(image_Gaussian,'gray')
plt.title('gaussian_Filter')
middle_Gaussian = np.array(255*image_Gaussian[449,[x for x in range(900)]],dtype=np.uint8) 
plt.subplot(236)
plt.plot(middle_Gaussian)
plt.title('gaussian_Filter')
plt.show()

在这里插入图片描述
带阻滤波器

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def Ideal_BeltResist_Filter(w,h):
    mask = np.ones([w,h],np.uint8)
    cv.circle(mask,(int(w/2),int(h/2)),100,0,-1)
    cv.circle(mask,(int(w/2),int(h/2)),50,1,-1)
    return mask
# def ILPF(w, h,radius):
#     mask = np.ones([w,h], dtype=np.uint8)
#     cv.circle(mask, (int(w / 2), int(h / 2)), radius, 0, -1)
#     return mask

def butterworth_BeltResist_Filter(shape, rank, radius, W):
    """ butterworth filter genreator

    H(u, v) = 1 / (1 + (D(u, v) / radius)^(2 * rank))
    Args:
        shape:  滤波器的形状
        rank:   滤波器阶数
        radius: 滤波器半径
    """
    # 中心位置
    h, w = shape[:2]
    cx, cy = int(w / 2), int(h / 2)
    # 计算以中心为原点坐标分量
    u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
    v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
    # 每个点到中心的距离
    dis = np.sqrt(u * u + v * v)
    filt = 1 / (1 + np.power((dis*W) / (dis**2-radius**2), 2 * rank))
    return filt

def gaussian_BeltResist_Filter(shape, sigma, W):
    """ Gaussian Low Pass filter
	Args:
		shape: 滤波器形状
		sigma: sigma值(半径)
    H(u, v) = e^(-(u^2 + v^2) / (2 * sigma^2))
    """
    h, w = shape[: 2]
    cx, cy = int(w / 2), int(h / 2)
    u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
    v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
    dis2 = np.sqrt(u * u + v * v)
    p = -((dis2**2-sigma**2) / (dis2 * W))**2
    #filt = 1 / (2 * pi * sigma**2) * np.exp(p)
    filt = 1-np.exp(p)
    return filt

plt.style.use('dark_background')
img_ILPF = Ideal_BeltResist_Filter(900, 900)
plt.subplot(231)
plt.imshow(img_ILPF,'gray')
plt.title('lowPassHzTemplate')
middle_ILPF=np.array(img_ILPF[449,[x for x in range(900)]],dtype=np.uint8)
plt.subplot(234)
plt.plot(middle_ILPF)
plt.title('lowPassHzTemplate')
plt.subplot(231)
plt.imshow(img_ILPF,'gray')
plt.title('lowPassHzTemplate')


image_butterworth=butterworth_BeltResist_Filter((900, 900),1, 60,60)
plt.subplot(232)
plt.imshow(image_butterworth,'gray')
plt.title('butterworth_Filter')
middlw_butterworth =np.array(255*image_butterworth[449,[x for x in range(900)]],dtype=np.uint8) #乘以255是为了便于显示
plt.subplot(235)
plt.plot(middlw_butterworth)
plt.title('butterworth_Filter')

image_Gaussian = gaussian_BeltResist_Filter((900, 900),50,90)
plt.subplot(233)
plt.imshow(image_Gaussian,'gray')
plt.title('gaussian_Filter')
middle_Gaussian = np.array(255*image_Gaussian[449,[x for x in range(900)]],dtype=np.uint8) 
plt.subplot(236)
plt.plot(middle_Gaussian)
plt.title('gaussian_Filter')
plt.show()

在这里插入图片描述
带通滤波器

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def Ideal_BeltPass_Filter(w,h):
    mask = np.zeros([w,h],np.uint8)
    cv.circle(mask,(int(w/2),int(h/2)),100,1,-1)
    cv.circle(mask,(int(w/2),int(h/2)),50,0,-1)
    return mask
# def ILPF(w, h,radius):
#     mask = np.ones([w,h], dtype=np.uint8)
#     cv.circle(mask, (int(w / 2), int(h / 2)), radius, 0, -1)
#     return mask

def butterworth_BeltPass_Filter(shape, rank, radius, W):
    """ butterworth filter genreator

    H(u, v) = 1 / (1 + (D(u, v) / radius)^(2 * rank))
    Args:
        shape:  滤波器的形状
        rank:   滤波器阶数
        radius: 滤波器半径
    """
    # 中心位置
    h, w = shape[:2]
    cx, cy = int(w / 2), int(h / 2)
    # 计算以中心为原点坐标分量
    u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
    v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
    # 每个点到中心的距离
    dis = np.sqrt(u * u + v * v)
    filt = 1-1 / (1 + np.power((dis*W) / (dis**2-radius**2), 2 * rank))
    return filt

def gaussian_BeltPass_Filter(shape, sigma, W):
    """ Gaussian Low Pass filter
	Args:
		shape: 滤波器形状
		sigma: sigma值(半径)
    H(u, v) = e^(-(u^2 + v^2) / (2 * sigma^2))
    """
    h, w = shape[: 2]
    cx, cy = int(w / 2), int(h / 2)
    u = np.array([[x - cx for x in range(w)]], dtype=np.float32)
    v = np.array([[y - cy for y in range(h)]], dtype=np.float32).T
    dis2 = np.sqrt(u * u + v * v)
    p = -((dis2**2-sigma**2) / (dis2 * W))**2
    #filt = 1 / (2 * pi * sigma**2) * np.exp(p)
    filt = np.exp(p)
    return filt

plt.style.use('dark_background')
img_ILPF = Ideal_BeltPass_Filter(900, 900)
plt.subplot(231)
plt.imshow(img_ILPF,'gray')
plt.title('lowPassHzTemplate')
middle_ILPF=np.array(img_ILPF[449,[x for x in range(900)]],dtype=np.uint8)
plt.subplot(234)
plt.plot(middle_ILPF)
plt.title('lowPassHzTemplate')
plt.subplot(231)
plt.imshow(img_ILPF,'gray')
plt.title('lowPassHzTemplate')


image_butterworth=butterworth_BeltPass_Filter((900, 900),1, 60,60)
plt.subplot(232)
plt.imshow(image_butterworth,'gray')
plt.title('butterworth_Filter')
middlw_butterworth =np.array(255*image_butterworth[449,[x for x in range(900)]],dtype=np.uint8) #乘以255是为了便于显示
plt.subplot(235)
plt.plot(middlw_butterworth)
plt.title('butterworth_Filter')

image_Gaussian = gaussian_BeltPass_Filter((900, 900),50,90)
plt.subplot(233)
plt.imshow(image_Gaussian,'gray')
plt.title('gaussian_Filter')
middle_Gaussian = np.array(255*image_Gaussian[449,[x for x in range(900)]],dtype=np.uint8) 
plt.subplot(236)
plt.plot(middle_Gaussian)
plt.title('gaussian_Filter')
plt.show()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_47472749/article/details/115422725