Jef*_*son 1 image fft imagemagick image-processing filter
我一直在使用斐济的 FFT 带通滤波器并取得了巨大成功,但我想在命令行中使用 ImageMagick 执行此操作。我看到 ImageMagick 有FFT 滤波器,他们的文档包括低通和高通滤波器,但我可以执行带通滤波器吗?
(很抱歉,我的过滤器和 FFT 知识......真的很糟糕,所以如果我知道将什么链接在一起,这可能很容易实现,等等......)
类似于您在链接中显示的低通滤波器的带通滤波器将是黑色背景上的白色环,用于方形图像。环的内半径和外半径决定了将通过的频率。在 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
Run Code Online (Sandbox Code Playgroud)
使用拉伸到全动态范围进行 FFT 处理:
convert lena-1.png -fft \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -auto-level \
lena_bp.png
Run Code Online (Sandbox Code Playgroud)
增益为 10 倍的交替处理:
convert lena-1.png -fft \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
lena_bp.png
Run Code Online (Sandbox Code Playgroud)
由于我不知道他们在 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
Run Code Online (Sandbox Code Playgroud)
convert lena-1.png -fft \
\( -clone 0 ring.png -compose multiply -composite \) \
-swap 0 +delete -ift -evaluate multiply 10 \
lena_bp.png
Run Code Online (Sandbox Code Playgroud)
请注意,我稍微模糊了环以减少“振铃”伪影。(参见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 实现了 Jinc -fx 内的函数)
这是一小组命令,可以用 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
Run Code Online (Sandbox Code Playgroud)
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]"
Run Code Online (Sandbox Code Playgroud)
如果您的意思是频带增强(频带增强)而不是带通,那么您可以将结果与原始结果(-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
Run Code Online (Sandbox Code Playgroud)
这些与我在 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%2Fcan%2Fcan %3Fdownload_frd%3D1&usg=AOvVaw2ws15jPD6C2-yAkfHmHYMH和https://www.scribd.com/doc/51981950/Frequency-Domain-Bandpass-Filtering-for-Image-Processing
在 ImageJ 中,也许他们正在使用巴特沃斯滤波器或更大的高斯模糊。或者他们可能只处理来自 HSI、HSV 或 LAB 的强度通道。