带有 ImageMagick 的带通滤波器

Bandpass filter with ImageMagick

我一直在使用 Fiji 的 FFT 带通滤波器并取得巨大成功,但我想在命令行中使用 ImageMagick 执行此操作。我看到 ImageMagick 有 FFT filters and they documentation includes low-pass and high-pass filters,但我可以执行带通滤波器吗?

斐济的带通滤波器设置似乎很适合我:

(抱歉,我的滤波器和 FFT 知识……真的很糟糕,所以如果我知道将什么链接在一起,也许这很容易实现……)

类似于您在 link 中显示的低通滤波器的带通滤波器对于方形图像来说是黑色背景上的白色环。环的内外半径决定了可以通过的频率。在 ImageMagick 中,您可以按如下方式执行此操作:

输入:

创建戒指图片:

convert lena-1.png -fill black -colorize 100 \
-fill white -draw "translate 64,64 circle 0,0 0,50" \
-fill black -draw "translate 64,64 circle 0,0 0,20" \
-alpha off -blur 0x1 \
ring.png


进行 FFT 处理并拉伸到全动态范围:

convert lena-1.png -fft  \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -auto-level \
lena_bp.png  


增益为 10 倍的交替处理:

convert lena-1.png -fft  \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
lena_bp.png  


因为我不知道他们在 ImageJ 或 Fiji 中编码了什么并且你没有显示输出,我只能猜测可能等效的是在距中心 3 和 40 像素处具有内半径和外半径。此外,我再次增加了 10 倍的动态范围增益以使其更加可见:

convert lena-1.png -fill black -colorize 100 \
-fill white -draw "translate 64,64 circle 0,0 0,40" \
-fill black -draw "translate 64,64 circle 0,0 0,3" \
-alpha off -blur 0x1 \
ring.png


convert lena-1.png -fft  \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
lena_bp.png  


请注意,我稍微模糊了环以减少 "ringing" 伪影。 (参见 https://en.wikipedia.org/wiki/Ringing_artifacts). Many low pass, high pass and band pass filters have stronger/longer tapering similar to increasing the blur. There are specially designed tapers, such as Butterworth. (see https://en.wikipedia.org/wiki/Butterworth_filter

我在 http://www.fmwconcepts.com/imagemagick/fourier_transforms/fourier.html 处有来自 ImageMagick 的 FFT 文档的扩展版本(注意一些 Jinc 过滤有点过时。自从我写了那篇文章以来,Imagemagick 在 -fx 中实现了 Jinc 函数)

这里有一小部分命令可以用 Unix 语法完成所有操作。如果您不想创建它,请删除 +write ring.png。此代码仅限于方形图像。

ImageMagick 6:

inner=3
outer=40
infile="lena-1.png"
cent=`convert "$infile" -format "%[fx:floor((w-1)/2)]" info:`
inname=`convert "$infile" -format "%t" info:`
suffix=`convert "$infile" -format "%e" info:`
convert "$infile" \
\( +clone -fill black -colorize 100 \
-fill white -draw "translate $cent,$cent circle 0,0 0,$outer" \
-fill black -draw "translate $cent,$cent circle 0,0 0,$inner" \
-alpha off -blur 0x1 +write ring.png \
-write mpr:bpass +delete \) \
-fft  \( -clone 0 mpr:bpass -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
${inname}_bandpass_${inner}_${outer}.$suffix


ImageMagick 7(只有一个命令行):

inner=3
outer=40
infile="lena-1.png" \
magick "$infile" \
-set option:cent "%[fx:floor((w-1)/2)]" \
-set filename:fn "%t_bandpass_${inner}_${outer}.%e" \
\( +clone -fill black -colorize 100 \
-fill white -draw "translate "%[cent],%[cent]" circle 0,0 0,$outer" \
-fill black -draw "translate "%[cent],%[cent]" circle 0,0 0,$inner" \
-alpha off -blur 0x1 +write ring.png \
-write mpr:bpass +delete \) \
-fft  \( -clone 0 mpr:bpass -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
"%[filename:fn]"


如果您指的是频带增强(频带增强)而不是频带通,则将结果与原始结果(-compose 加 -composite)相加。在 ImageMagick 6 中,这将是:

inner=3
outer=40
infile="lena-1.png"
cent=`convert "$infile" -format "%[fx:floor((w-1)/2)]" info:`
inname=`convert "$infile" -format "%t" info:`
suffix=`convert "$infile" -format "%e" info:`
convert "$infile" \
\( +clone -fill black -colorize 100 \
-fill white -draw "translate $cent,$cent circle 0,0 0,$outer" \
-fill black -draw "translate $cent,$cent circle 0,0 0,$inner" \
-alpha off -blur 0x1 +write ring.png \
-write mpr:bpass +delete \) \
-fft  \( -clone 0 mpr:bpass -compose multiply -composite \) \
-swap 0 +delete -ift "$infile" -compose plus -composite \
${inname}_bandenhance_${inner}_${outer}.$suffix


这些与我在 ImageJ 中使用这些设置得到的结果不同。不幸的是,我不知道他们在做什么。 ImageJ 结果对我来说更像是低通滤波,而不是我所知道的 enhanced/band 带通。参见 https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=12&cad=rja&uact=8&ved=2ahUKEwjJvoWD6L7eAhXJslQKHf1jArgQFjALegQICBAC&url=https%3A%2F%2Fcanvas.instructure.com%2Ffiles%2F6907524%2Fdownload%3Fdownload_frd%3D1&usg=AOvVaw2ws15jPD6C2-yAkfHmHYMH and https://www.scribd.com/doc/51981950/Frequency-Domain-Bandpass-Filtering-for-Image-Processing

在 ImageJ 中,也许他们正在使用 Butterworth 过滤器或更大的高斯模糊。或者他们可能只处理来自 HSI 或 HSV 或 LAB 的强度通道。