使用 scipy/numpy 在 python 中进行图像处理的高通滤波器
Posted
技术标签:
【中文标题】使用 scipy/numpy 在 python 中进行图像处理的高通滤波器【英文标题】:High Pass Filter for image processing in python by using scipy/numpy 【发布时间】:2011-08-30 23:58:09 【问题描述】:我目前正在学习图像处理。在 Scipy 中,我知道 Scipy.signal 中有一个中值滤波器。谁能告诉我是否有一种类似于高通滤波器的滤波器?
谢谢
【问题讨论】:
【参考方案1】:scipy.filter 包含大量通用过滤器。 iirfilter 类之类的东西可以配置为产生典型的 Chebyshev 或 Buttworth 数字或模拟高通滤波器。
【讨论】:
【参考方案2】:一个简单的高通滤波器是:
-1 -1 -1
-1 8 -1
-1 -1 -1
Sobel operator 是另一个简单的例子。
在图像处理中,这类过滤器通常被称为“边缘检测器”-the Wikipedia page 我上次检查时没问题。
【讨论】:
确实,拉普拉斯算子通常被称为边缘检测器。悲伤,真的,因为它不是。它非常擅长检测线条和点,而不是太多的边缘(例如:它在边缘处没有给出高响应,它在那里往往为零)。【参考方案3】:“高通滤波器”是一个非常通用的术语。有无数种不同的“高通滤波器”可以做非常不同的事情(例如,边缘检测滤波器,如前所述,在技术上是高通(大多数实际上是带通)滤波器,但与您可能的效果截然不同记住了。)
无论如何,根据您提出的大多数问题,您可能应该查看scipy.ndimage
而不是scipy.filter
,特别是如果您要处理大图像(ndimage 可以执行操作就地,节省内存)。
作为一个基本示例,展示几种不同的做事方式:
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()
【讨论】:
感谢您的精彩脚本!我学到了很多关于 convolve() 和 matplotlib 和甚至 Python 的知识。 (我不知道像“plot.i”这样的东西可以工作。) 高斯滤波器不是低通滤波器吗? @A.H. - 是的,但是如果你从原始图像中减去高斯低通,你会得到一个等效的高通滤波器。这就是所谓的“高斯高通”。 (查看该部分代码上方的 cmets。) 给定convolve的返回,有可能得到dx和dy吗?【参考方案4】:以下是我们如何使用scipy fftpack
设计 HPF
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 后的输出图像
【讨论】:
【参考方案5】:您可以使用高斯滤波器,因为它比纯 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
【讨论】:
以上是关于使用 scipy/numpy 在 python 中进行图像处理的高通滤波器的主要内容,如果未能解决你的问题,请参考以下文章
Python 中的二阶导数 - scipy/numpy/pandas
通过Scipy和Numpy使用Python将数据拟合到ODE系统
Windows下python virtualenv使用,镜像源设置,批量安装,安装scipy,numpy