我正在寻找一个掩码Butterworth高通滤波器的C ++实现。
我有一个已被屏蔽的图像,我想应用一个Butterworth高通滤波器,而不会在图像被遮挡的情况下产生边缘效应。
目前我正在使用vtk过滤我的图像。
欢迎提出任何建议:)
答案 0 :(得分:0)
你可以用两个概念来做到这一点:
可以使用低通滤波器和一些平凡的算法来获得高通滤波器。例如(在这里使用通用语法,您没有标记任何特定语言):
img = ... (you input image)
lowpass = smooth(img)
highpass = img - lowpass
未经请求的建议:
我没有看到使用巴特沃斯滤波器的重点。如果你只限于因果滤波器(如在电子电路中实时处理信号),这是一个很棒的设计,但对于图像来说这是一个毫无意义的约束。使用Gaussian filter。
当您面对不确定或不完整的数据时(如屏蔽图像的情况:被屏蔽的像素被视为未知值),则归一化卷积是可行的方法。
归一化卷积通常如下实现。在这里,我们将mask
视为掩码图像,其中值为1,其中数据是已知的,值为0而不是掩码(掩码中的区域为0):
out = filter(mask * img) / filter(img)
这里,filter
是任何线性滤波器(卷积),例如上面讨论的高斯平滑或高通滤波器。
out
将屏蔽区域内的信息。此信息是从已知数据推断出来的,但您可能不想相信这些信息。然后,您可以再次屏蔽out
,以确保您不会使用这些值:
out = out * mask
请注意,乘以掩码意味着屏蔽的像素乘以0,导致0输出,其他值乘以1,因此不受影响。