我目前正在学习图像处理。在SciPy中,我知道scipy.signal中有一个中值滤波器。是否有类似于高通滤波器的滤波器?
wqsoz72f1#
“高通滤波器”是一个非常通用的术语。存在无限数量的不同的“高通滤波器”,它们做非常不同的事情(例如,如前所述,边缘检测滤波器在技术上是高通(大多数实际上是带通)滤波器,但其效果与您可能想到的效果非常不同。)无论如何,根据您提出的大多数问题,您可能应该研究scipy.ndimage而不是scipy.filter,特别是如果您要处理大图像(ndimage可以就地执行操作,节省内存)。作为一个基本的例子,展示了几种不同的做事方式:
scipy.ndimage
scipy.filter
import matplotlib.pyplot as plt import numpy as np from scipy import ndimage import Image def plot(data, title): plot.i += 1 plt.subplot(2,2,plot.i) plt.imshow(data) plt.gray() plt.title(title) plot.i = 0 # Load the data... im = Image.open('lena.png') data = np.array(im, dtype=float) plot(data, 'Original') # A very simple and very narrow highpass filter kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]) highpass_3x3 = ndimage.convolve(data, kernel) plot(highpass_3x3, 'Simple 3x3 Highpass') # A slightly "wider", but sill very simple highpass filter kernel = np.array([[-1, -1, -1, -1, -1], [-1, 1, 2, 1, -1], [-1, 2, 4, 2, -1], [-1, 1, 2, 1, -1], [-1, -1, -1, -1, -1]]) highpass_5x5 = ndimage.convolve(data, kernel) plot(highpass_5x5, 'Simple 5x5 Highpass') # Another way of making a highpass filter is to simply subtract a lowpass # filtered image from the original. Here, we'll use a simple gaussian filter # to "blur" (i.e. a lowpass filter) the original. lowpass = ndimage.gaussian_filter(data, 3) gauss_highpass = data - lowpass plot(gauss_highpass, r'Gaussian Highpass, $\sigma = 3 pixels$') plt.show()
字符串
的数据
zysjyyx42#
下面是我们如何使用scipy fftpack设计HPF
scipy fftpack
from skimage.io import imread import matplotlib.pyplot as plt import scipy.fftpack as fp im = np.mean(imread('../images/lena.jpg'), axis=2) # assuming an RGB image plt.figure(figsize=(10,10)) plt.imshow(im, cmap=plt.cm.gray) plt.axis('off') plt.show()
原图
F1 = fftpack.fft2((im).astype(float)) F2 = fftpack.fftshift(F1) plt.figure(figsize=(10,10)) plt.imshow( (20*np.log10( 0.1 + F2)).astype(int), cmap=plt.cm.gray) plt.show()
型
FFT频谱
的
(w, h) = im.shape half_w, half_h = int(w/2), int(h/2) # high pass filter n = 25 F2[half_w-n:half_w+n+1,half_h-n:half_h+n+1] = 0 # select all but the first 50x50 (low) frequencies plt.figure(figsize=(10,10)) plt.imshow( (20*np.log10( 0.1 + F2)).astype(int)) plt.show()
阻止频谱中的低频
im1 = fp.ifft2(fftpack.ifftshift(F2)).real plt.figure(figsize=(10,10)) plt.imshow(im1, cmap='gray') plt.axis('off') plt.show()
应用HPF后的输出图像
zf9nrax13#
一个简单的高通滤波器是:
-1 -1 -1 -1 8 -1 -1 -1 -1
字符串Sobel operator是另一个简单的例子。在图像处理中,这些类型的过滤器通常被称为“边缘检测器”-上次我检查时,the Wikipedia page是OK的。
zzwlnbp84#
scipy.filter包含大量的通用过滤器。类似iirfilter类的东西可以配置为产生典型的Chebyshev或Butworth数字或模拟高通滤波器。
waxmsbnn5#
你可以使用高斯滤波器,因为它比纯HPF提供更清晰的锐度,对于使用简单的HPF,你可以使用下面的代码
import numpy as np import cv2 from scipy import ndimage class HPF(object): def __init__(self, kernel, image): self.kernel = np.array(kernel) self.image = image def process(self): return ndimage.convolve(self.image, self.kernel) if __name__ == "__main__": #enter ur image location image = cv2.imread("images/test2.jpg", 0) kernel3x3 = [[-1,-1,-1],[-1,8,-1],[-1,-1,-1]] kernel5x5 = [[-1, -1, -1, -1, -1], [-1, 1, 2, 1, -1], [-1, 2, 4, 2, -1], [-1, 1, 2, 1, -1], [-1, -1, -1, -1, -1]] hpf1 = HPF(kernel3x3, image) hpfimage1 = hpf1.process() hpf2 = HPF(kernel5x5, image) hpfimage2 = hpf2.process() cv2.imshow("3x3",hpfimage1) cv2.imshow("5x5",hpfimage2) cv2.waitKey() cv2.destroyAllWindows()
字符串要使用高斯过滤器,只需添加高斯模糊到您的图像
blurred = cv2.GaussianBlur(image, (11, 11), 0)
型然后从原始图像中减去它
g_hpf = image - blurred
型原始代码取自:Image Sharpening by High Pass Filter using Python and OpenCV
5条答案
按热度按时间wqsoz72f1#
“高通滤波器”是一个非常通用的术语。存在无限数量的不同的“高通滤波器”,它们做非常不同的事情(例如,如前所述,边缘检测滤波器在技术上是高通(大多数实际上是带通)滤波器,但其效果与您可能想到的效果非常不同。)
无论如何,根据您提出的大多数问题,您可能应该研究
scipy.ndimage
而不是scipy.filter
,特别是如果您要处理大图像(ndimage可以就地执行操作,节省内存)。作为一个基本的例子,展示了几种不同的做事方式:
字符串
的数据
zysjyyx42#
下面是我们如何使用
scipy fftpack
设计HPF字符串
原图
的数据
型
FFT频谱
的
型
阻止频谱中的低频
的
型
应用HPF后的输出图像
的
zf9nrax13#
一个简单的高通滤波器是:
字符串
Sobel operator是另一个简单的例子。
在图像处理中,这些类型的过滤器通常被称为“边缘检测器”-上次我检查时,the Wikipedia page是OK的。
zzwlnbp84#
scipy.filter包含大量的通用过滤器。类似iirfilter类的东西可以配置为产生典型的Chebyshev或Butworth数字或模拟高通滤波器。
waxmsbnn5#
你可以使用高斯滤波器,因为它比纯HPF提供更清晰的锐度,对于使用简单的HPF,你可以使用下面的代码
字符串
要使用高斯过滤器,只需添加高斯模糊到您的图像
型
然后从原始图像中减去它
型
原始代码取自:Image Sharpening by High Pass Filter using Python and OpenCV