LINUX.ORG.RU

Удаление шума в imagemagick

 ,


0

3

Для удаления шума imagemagick предлагает оператор -noise <радиус>. Этот оператор такой же примитивный, как и все остальные операторы и в одиночку не представляет реальной ценности для обработки изображений. Предлагаю более эффективный рецепт (скрипт) для денойса:

$ cat imgblurdenoise.sh

#!/bin/bash

# Image denoise

function usage() {
    cat << EOF
    Usage: $0 {input image}

    Sample: $0 example.jpg [Q]

EOF
}
if [ $# -eq 0 ] ; then
    usage
    exit 1
fi

src="$1"
if [ -z "$2" ]
then
    tq="2"
else
    tq="$2"
fi
if [ $tq -gt 48 ]
then
    ted="48"
fi
trd=$(((1+2*$tq)))
ted=$(((2+$tq)))

tmpb="/tmp/temp-$$-b.ppm"
tmpd="/tmp/temp-$$-d.ppm"
tmpl="/tmp/temp-$$-l.ppm"
tmpn="/tmp/temp-$$-n.ppm"
tmps="/tmp/temp-$$-s.ppm"


tedb=$(((50-$ted)))
tedw=$(((50+$ted)))
tedbn=$(((50-(2500/$ted))))
tedwn=$(((50+(2500/$ted))))

convert -blur "$trd" "$src" "$tmpb"
echo "R=$trd"
echo "dL=$ted"
convert "$src" "$tmpb" -fx 'u[0]-u[1]+0.5' "$tmpd"
rm -f "$tmpb"
echo "LEVEL=($tedb,$tedw)"
convert "$tmpd" -level $tedb%,$tedw% "$tmpl"
rm -f "$tmpd"
echo "LEVEL=($tedbn,$tedwn)"
convert "$tmpl" -level $tedbn%,$tedwn% "$tmpn"
rm -f "$tmpl"
convert "$src" "$tmpn" -fx 'u[0]-u[1]+0.5' "$tmps"
rm -f "$tmpn"
convert -sharpen "$trd" "$tmps" "$src.dq$tq.png"
echo "R=$trd"
rm -f "$tmps"
Deleted

Круто. Мне кажется, что было бы проще использовать API маджика и какой-нибудь скриптовый язык или даже си. Тогда не будет лишних пересохранений. А ещё в ИМ кроме -noise есть -adaptive-blur, -statistic, -morphology Convolve и даже fft.

anonymous ()
Ответ на: комментарий от anonymous

Подавление "вибрации фона"

В своём рецепте я лишь показал, что в imagemagick можно производить не только примитивную фильтрацию, но и производить такие операции, как подавление «вибрации фона». По моему мнению в рецептах по imagemagick слабо используются возможности графического калькулятора (-fx). А то, что мне удалось сделать это на чистом bash, означает, что это можно сделать и с помощью «API маджика и какой-нибудь скриптовый язык или даже си».

Deleted ()
Ответ на: Подавление "вибрации фона" от Deleted

Re: Подавление "вибрации фона"

А где можно визуально ознакомиться с результатом? А то я даже не знаю - вдруг у меня эти самые «вибрации фона» есть, а я их как лох не подавляю.

anonymous ()

Аккуратность с градиентом

Тестирование показало, что изложенный выше скрипт не очень аккуратно работает с градиентом (разлагает его на полосы), поэтому привожу скрипт, разлагающий «вибрацию фона» на «положительную» и «отрицательную». С градиентом этот скрипт работает гораздо аккуратней.

$ cat imgblurdenoisebw.sh 
#!/bin/bash

if [ -z "$1" ]
then
    echo "Usage $0 <image> [q]"
    exit 1
else
    src="$1"
fi

if [ -z "$2" ]
then
    tq="2"
else
    tq="$2"
fi

echo "$src"

tfr=$(((1+2*$tq)))
tlr=$(((2+$tq)))
tle=$(((10000/$tlr)))

tfb="/tmp/imgblurdenoise-$$-b.ppm"
tfdb="/tmp/imgblurdenoise-$$-db.ppm"
tfdw="/tmp/imgblurdenoise-$$-dw.ppm"
tflb="/tmp/imgblurdenoise-$$-lb.ppm"
tflw="/tmp/imgblurdenoise-$$-lw.ppm"
tfs="/tmp/imgblurdenoise-$$-s.ppm"

tname="$src.dq$tq.png"

if [ -f "$tname" ]
then
    identify "$tname"
else
    convert -verbose -blur "$tfr" "$src" "$tfb"
    convert -verbose "$src" "$tfb" -fx 'u[1]-u[0]' "$tfdb"
    convert -verbose "$src" "$tfb" -fx 'u[0]-u[1]' "$tfdw"
    rm -f "$tfb"
    convert -verbose "$tfdb" -level 0%,$tlr% -level 0%,$tle% "$tflb"
    convert -verbose "$tfdw" -level 0%,$tlr% -level 0%,$tle% "$tflw"
    rm -f "$tfdb"
    rm -f "$tfdw"
    convert -verbose "$src" "$tflb" "$tflw" -fx 'u[0]+u[1]-u[2]' "$tfs"
    rm -f "$tflb"
    rm -f "$tflw"
    convert -verbose -sharpen "$tfr" -enhance "$tfs" "$tname"
    rm -f "$tfs"
fi

Deleted ()
Ответ на: Аккуратность с градиентом от Deleted

Re: Аккуратность с градиентом

Ты не понимаешь. Пока ты не сформулировал что такое эта твоя «вибрация фона» и не привёл примеров - всем твои скрипты похуй же. Определи что за проблему ты решаешь чтобы было понятно.

anonymous ()

Картинку до и после залей на какой-нибудь ITmages, посмотреть на то что это делает визуально хочется, а искать картинку с шумами и обрабатывать её самому лениво.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

"Вибрация фона"

«Вибрация фона» - «неузкое» понятие, в двух словах не объяснишь. Но на практике основная причина возникновения «вибрации фона» - квантование ДКП-коэффициентов(jpeg). А говоря ещё проще - это сохранение изображения в jpeg формате.

Пример: Изображение jpeg - [img]http://storage9.static.itmages.ru/i/15/1031/s_1446292198_2448553_cbf397fe89.jpg[/img]

После применения скрипта - [img]http://storage6.static.itmages.ru/i/15/1031/s_1446292843_4162191_f05c7683c3.png[/img]

Deleted ()
Ответ на: "Вибрация фона" от Deleted

Re: "Вибрация фона"

Понятно. В приведённом примере увидел замыливание переднего плана (шестерёнки или чо там, на полтора часа от центра и цепь в ПВУ) - не понравилось. Уж лучше вибрация чем мыло.

anonymous ()
Ответ на: Re: "Вибрация фона" от anonymous

"Лучше"

«Лучше» - плохой критерий.

Я всегда использую в качестве критерия - «badness»(«плохость»).

«Визуальная плохость» обработанного изображения примерно такая же как у исходного. Но всё коренным образом меняется при попытке увеличения изображения.

Deleted ()
Ответ на: Re: "Вибрация фона" от anonymous

Увеличение "плохости" при upsamplinge

Увеличение «плохости» при upsamplinge:

Увеличение jpeg в 2 раза: [img]http://storage5.static.itmages.ru/i/15/1031/s_1446304705_6258089_c8ff146fe6.png[/img]

Увеличение обработки в 2 раза: [img]http://storage8.static.itmages.ru/i/15/1031/h_1446304750_4914426_b824d2943c.png[/img]

Deleted ()
Ответ на: "Лучше" от Deleted

Re: "Лучше"

Я всегда использую в качестве критерия - «badness»(«плохость»).

<br/><br/> Может тебе лучше использовать какие-нибудь общеупотребительные понятия, я не выдумывать свои собственные? :)

anonymous ()
Ответ на: Re: "Лучше" от anonymous

badness

«badness» - это не моё понятие. Совсем не моё. См. Дональд Кнут.

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.