带ImageMagick的带通滤波器

时间:2018-11-05 16:45:08

标签: image image-processing filter imagemagick fft

我一直在成功使用斐济的FFT带通滤波器,但是我想在命令行中使用ImageMagick做到这一点。我看到ImageMagick具有FFT filters,并且它们的文档包括low-passhigh-pass filters,但是我可以执行带通滤波器吗?

斐济的带通滤波器设置似乎对我来说效果很好:enter image description here

(很抱歉,我的滤波器和FFT知识很......很糟糕,因此,如果我知道要链接的内容,那么就很容易做到这一点,等等)

1 个答案:

答案 0 :(得分:4)

与您在链接中显示的低通滤波器相似的带通滤波器将是黑色背景上的白色环,用于方形图像。环的内半径和外半径决定了将要通过的频率。在ImageMagick中,您可以执行以下操作:

输入:

enter image description here

创建戒指图片:

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


enter image description here

将FFT处理到完整的动态范围:

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


enter image description here

增益为10倍的替代处理:

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


enter image description here

由于我不知道它们在ImageJ或斐济编码的内容,并且您未显示任何输出,因此我只能猜测等效的是在距中心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


enter image description here

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


enter image description here

请注意,我稍微模糊了环以减少“振铃”伪影。 (请参见https://en.wikipedia.org/wiki/Ringing_artifacts)。许多低通,高通和带通滤波器具有更强/更长的锥度,类似于增加模糊。有专门设计的锥度,例如Butterworth。 (请参阅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


enter image description here

这些与我在ImageJ中的设置所得到的结果不同。不幸的是,我不知道他们在做什么。与我所知的带增强/带通相比,ImageJ的结果对我来说更像是低通滤波。参见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-yAkfHmHYMHhttps://www.scribd.com/doc/51981950/Frequency-Domain-Bandpass-Filtering-for-Image-Processing

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