【问题标题】:Bandpass filter with ImageMagickImageMagick 带通滤波器
【发布时间】:2019-04-09 01:31:58
【问题描述】:

我一直在使用 Fiji 的 FFT 带通滤波器并取得了巨大的成功,但我想在命令行中使用 ImageMagick 执行此操作。我看到 ImageMagick 有 FFT filters,他们的文档包括 low-passhigh-pass filters,但我可以执行带通滤波器吗?

斐济的带通滤波器设置似乎对我很有效:

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

【问题讨论】:

  • 我对ImageMagick一无所知,所以让其他人回答。但是您可以通过链接低通和高通滤波器来制作带通滤波器。
  • @CrisLuengo - 我想也许你就是这样做的。你真的可以只做一个然后另一个系列吗?
  • 是:应用带通滤波器下限的高通滤波器,并在结果上应用带通滤波器上限的低通滤波器。

标签: image image-processing filter imagemagick fft


【解决方案1】:

类似于您在链接中显示的低通滤波器的带通滤波器将是方形图像的黑色背景上的白色环。环的内半径和外半径决定了要通过的频率。在 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  


请注意,我稍微模糊了环以减少“振铃”伪影。 (见https://en.wikipedia.org/wiki/Ringing_artifacts)。许多低通、高通和带通滤波器具有更强/更长的锥度,类似于增加模糊。有专门设计的锥度,例如巴特沃斯。 (见https://en.wikipedia.org/wiki/Butterworth_filter

我有来自 ImageMagick 的 FFT 文档的扩展版本,地址为 http://www.fmwconcepts.com/imagemagick/fourier_transforms/fourier.html(请注意,一些 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 结果对我来说更像是低通滤波,而不是我所知道的带增强/带通。见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 中,也许他们正在使用巴特沃斯滤波器或更大的高斯模糊。或者他们可能只处理来自 HSI、HSV 或 LAB 的强度通道。

【讨论】:

  • 这太好了,谢谢!我没有包含示例图像,因为我的用例看起来不多,但本质上我想删除图像中的大尺度渐变(如由不均匀照明引起的)并保留小尺度细节 - 建议我使用带通并且似乎在我的图像上效果很好。
  • 你的例子很清楚,但是这如何处理非方形图像?
  • @JeffThompson 我认为您必须创建椭圆环而不是圆形环。椭圆的形状将与图像的尺寸具有相同的纵横比。
猜你喜欢
  • 2015-03-05
  • 2017-01-05
  • 1970-01-01
  • 2023-04-10
  • 2018-04-22
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 2014-06-03
相关资源
最近更新 更多