Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何创建自定义带通滤波器?_Image Processing_Filter - Fatal编程技术网

Image processing 如何创建自定义带通滤波器?

Image processing 如何创建自定义带通滤波器?,image-processing,filter,Image Processing,Filter,在第4.1节(预处理)中,给出了带通滤波器的方程: 在哪里, 现在,我实现了如下内容: 但是,此代码不会产生任何结果。您需要创建内核的映像,然后将其与映像进行卷积。fft用于优化大图像的卷积。您可以使用filter2D函数让opencv为您做任何事情 内核映像: 源图像: 应用的卷积: 尝试控股: 请参阅下面的代码: import cv2 import math import numpy as np class Kernel(object): def H_Function

在第4.1节(预处理)中,给出了带通滤波器的方程:

在哪里,

现在,我实现了如下内容:


但是,此代码不会产生任何结果。

您需要创建内核的映像,然后将其与映像进行卷积。fft用于优化大图像的卷积。您可以使用filter2D函数让opencv为您做任何事情

内核映像:

源图像:

应用的卷积:

尝试控股:

请参阅下面的代码:

import cv2
import math
import numpy as np

class Kernel(object):
    def H_Function(self, Dh, Dv, u, v, centerX, centerY, theta, n):
        return 1 / (1 + 0.414 * math.sqrt(math.pow(self.U_Star(u, centerX, centerY, theta) / Dh + self.V_Star(v, centerX, centerY, theta) / Dv, 2 * n)))

    def U_Star(self, u, centerX, centerY, theta):
        return math.cos(theta) * (u + self.Tx(centerX, theta)) + math.sin(theta) * (u + self.Ty(centerY, theta))

    def V_Star(self, u, centerX, centerY, theta):
        return (-math.sin(theta)) * (u + self.Tx(centerX, theta)) + math.cos(theta) * (u + self.Ty(centerY, theta))

    def Tx(self, center, theta):
        return center * math.cos(theta)

    def Ty(self, center, theta):
        return center * math.sin(theta)

K = Kernel()

size = 40, 40
kernel = np.zeros(size, dtype=np.float)
Dh=2
Dv=2
centerX = -size[0] / 2
centerY = -size[1] / 2
theta=0.9
n=4

for u in range(0, size[0]):
    for v in range(0, size[1]):
        kernel[u][v] = K.H_Function(Dh, Dv, u, v, centerX, centerY, theta, n) 
kernelNorm = np.copy(kernel)
cv2.normalize(kernel, kernel, 1.0, 0, cv2.NORM_L1)
cv2.normalize(kernelNorm, kernelNorm, 0, 255, cv2.NORM_MINMAX)
cv2.imwrite("kernel.jpg", kernelNorm)

imgSrc = cv2.imread('src.jpg',0)

convolved = cv2.filter2D(imgSrc,-1,kernel)
cv2.normalize(convolved, convolved, 0, 255, cv2.NORM_MINMAX)
cv2.imwrite("conv.jpg", convolved)
th, thresholded = cv2.threshold(convolved, 100, 255, cv2.THRESH_BINARY)
cv2.imwrite("thresh.jpg", thresholded)

实际上不需要将过滤器存储在数组中。您只需对计算FFT的值的u,v分量执行双循环,计算每对的滤波器响应H(u,v),并将其乘以相应的阵列元素。对修改后的阵列进行反向变换后,将得到滤波后的图像。

滤波器是频域的,但
Mat
obj通常将图像保存在非频域。您必须对图像进行2D fft,将图像与滤波器相乘,然后进行2D fft逆运算,以获得空间坐标中的图像。您需要更详细的信息吗?然后您可以直接使用滤波器函数计算2D数组,该数组包含频率坐标各组合的滤波器值。同意@Trilarion。这是在我的实现中通过以下几行实现的:
范围内的u(0,大小[0]):范围内的v(0,大小[1]):内核[u][v]=K.H_函数(Dh,Dv,u,v,centerX,centerY,theta,n)
@Adrian Dh一个Dv设置频率,您要提取它。θ设置方向。这背后有一些直觉。在本文的第4.1节中,他们使用过滤器来提取图像上的线,这就是为什么内核看起来也像一条线,所以与图像的标量乘法将在一条线上的点上给出高响应。在空间域中,Dh和Dv设置这条线的宽度(大宽度-较低频率)。内核的θ应该与图像上检测到的线的角度相匹配。这个解决方案有什么问题?@anonymous所以你不关心可视化过滤器或任何中间步骤?@Adrian如果你认为可视化有问题,请你解释一下好吗?@taarraas我不是说你的答案不好。我没有足够的Python经验来观察您的代码并确定其正确性。@Adrian您所说的模拟形式是什么意思?PC机不直接处理模拟信号,而是将模拟信号转换成数字信号进行处理。内核和输入图像都是数字的和离散的。@anonymous:对不起,我不是一个免费的编码服务。我想知道你有什么问题。进行FFT是一个简单的函数调用。将数组元素乘以H(u,v)的求值是立即的。进行逆FFT也是一个函数调用。那又怎么样?