数字图像处理的python实践(13)——频域高通高斯滤波和拉普拉斯滤波

     图像的锐化可以通过衰减图像频谱中的低频成分来实现,这建立起了空间域图像锐化和频率域高通滤波之间的对应关系。我们想要实现和上一章中高斯低通滤波相反的效果,即高斯高通滤波,实现的方法和上一章的代码基本一致,就是滤波函数有所不同,形式为

H(u,v)=1-e^{-[(u-\frac{M}{2})^{2}+(v-\frac{N}{2})^{2}]/2\sigma ^{2}}

       实现的代码如下,图像还是那熟悉的动漫女头,处理后边缘显得很清晰很突出,而除了边缘外其他的区域的颜色都是浅色。当sigma的数值越大,边缘提取得越精确,但是有可能出现不完整的边缘信息,即边缘不连续,所以也不适合取值过大。

import cv2
import numpy as np

def GaussianHighFrequencyFilter(src, dst, sigma = 1):

	im = cv2.imread(src, 0)
	imarr = np.array(im)

	height, width = imarr.shape

	fft = np.fft.fft2(imarr)
	fft = np.fft.fftshift(fft)

	for i in range(height):
		for j in range(height):
			fft[i, j] *= (1 - np.exp(-((i - (height - 1)/2)**2 + (j - (width - 1)/2)**2)/2/sigma**2))

	fft = np.fft.ifftshift(fft)
	ifft = np.fft.ifft2(fft)

	ifft = np.real(ifft)
	max = np.max(ifft)
	min = np.min(ifft)

	res = np.zeros((height, width), dtype = "uint8")

	for i in range(height):
		for j in range(width):
			res[i, j] = 255 * (ifft[i, j] - min)/(max - min)

	cv2.imwrite(dst, res)	

gray_girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gray_girl.jpg"
gaussian_girl = "C:/Users/60214/Desktop/python_work/DigitalExecution/gaussian_girl.jpg"

GaussianHighFrequencyFilter(gray_girl, gaussian_girl, 20)

  数字图像处理的python实践(13)——频域高通高斯滤波和拉普拉斯滤波_第1张图片

         接下来是频域的拉普拉斯滤波。其推导可以从一维开始,根据傅里叶变换的性质:

FFT[\frac{\mathrm{d^{n}f(x)} }{\mathrm{d} x^{n}}]=(ju)^{n}F(u)

因此拉普拉斯算子的傅里叶变换计算如下

FFT[\frac{\partial ^{2}f(x,y)}{\partial x^2}+\frac{\partial ^{2}f(x,y)}{\partial y^2}]=[](ju)^{2}+(jv)^{2}]F(u,v)=-(u^{2}+v^{2})F(u,v)

因此有下式成立

FFT[\bigtriangledown ^{2}f(x,y)]=-(u^{2}+v^{2})F(u,v)

所以频域的拉普拉斯滤波器为

H(u,v)=-(u^{2}+v^{2})

根据频域图像频域原点平移的规律,将上式写为(M和N分别好似图像的宽和高)

H(u,v)=-[(u-\frac{M}{2})^{2}+(v-\frac{N}{2})^{2}]

       实现的代码如下。

import cv2
import numpy as np

def LaplacianFrequencyFilter(src, dst):

	im = cv2.imread(src, 0)
	imarr = np.array(im)

	height, width = imarr.shape

	fft = np.fft.fft2(imarr)
	fft = np.fft.fftshift(fft)

	for i in range(height):
		for j in range(height):
			fft[i, j] *= -((i - (height - 1)/2)**2 + (j - (width - 1)/2)**2)

	fft = np.fft.ifftshift(fft)
	ifft = np.fft.ifft2(fft)

	ifft = np.real(ifft)
	max = np.max(ifft)
	min = np.min(ifft)

	res = np.zeros((height, width), dtype = "uint8")

	for i in range(height):
		for j in range(width):
			res[i, j] = 255 * (ifft[i, j] - min)/(max - min)

	cv2.imwrite(dst, res)

 

 

 

 

你可能感兴趣的:(python,数字图像处理的python实践)