Полосовой фильтр с ImageMagick - PullRequest
0 голосов
/ 05 ноября 2018

Я с большим успехом использовал полосовой FFT-фильтр Фиджи, но я бы хотел сделать это в командной строке с ImageMagick. Я вижу, что в ImageMagick есть фильтры FFT , и их документация включает в себя фильтры нижних частот и фильтры верхних частот , но можно ли выполнить полосовой фильтр?

Настройки полосового фильтра с Фиджи, которые мне кажутся хорошими: enter image description here

(С извинениями, что мои знания о фильтрах и БПФ ... очень плохие, так что, может быть, это легко сделать, если бы я знал, что связывать вместе и т. Д ...)

1 Ответ

0 голосов
/ 05 ноября 2018

Полосовой фильтр, похожий на фильтр нижних частот, который вы показываете в своей ссылке, будет белым кольцом на черном фоне для квадратных изображений. Внутренний и внешний радиусы кольца определяют частоты, которые будут передаваться. В 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

Альтернативная обработка с коэффициентом усиления 10x:

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)

У меня есть расширенная версия документации FFT от ImageMagick по адресу http://www.fmwconcepts.com/imagemagick/fourier_transforms/fourier.html (обратите внимание, что некоторая фильтрация 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


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-yAkfHmHYMH и https://www.scribd.com/doc/51981950/Frequency-Domain-Bandpass-Filtering-for-Image-Processing

В ImageJ, возможно, они используют фильтр Баттерворта или большее размытие по Гауссу. Или, возможно, они только обрабатывают канал интенсивности от, скажем, HSI, HSV или LAB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...