Удалить фигуры из изображения с количеством пикселей X или менее - PullRequest
1 голос
/ 10 декабря 2010

Если у меня есть изображение с, скажем, квадратами. Можно ли удалить все фигуры, сформированные из 10 (не белых) пикселей или менее, и сохранить все фигуры, сформированные из 11 пикселей или более? Я хочу сделать это программно или с помощью командной строки.

Заранее спасибо!

Ответы [ 7 ]

3 голосов
/ 13 декабря 2010

Возможно, алгоритм под названием Erosion может быть полезен. Он работает на логических изображениях, сжимая все области «истинно», удаляя один слой их поверхности пикселей. Наносите несколько раз, и небольшие области исчезают, большие остаются (хотя и уменьшаются). Уменьшите количество выживших с помощью обратного алгоритма расширения (примените эрозию к логическому дополнению изображения). Найдите способ определения логических изображений, проверив, находится ли пиксель внутри «объекта», как вы его определяете, и найдите способ применить результаты к исходному изображению, чтобы изменить нежелательные маленькие объекты на цвет фона.

Чтобы быть более конкретным, потребуются примеры.

3 голосов
/ 10 декабря 2010

Посмотрите алгоритмы заливки и измените их для подсчета пикселей вместо заполнения. Затем, если форма достаточно мала, заполните ее белым.

2 голосов
/ 14 декабря 2010

Есть несколько способов подойти к этому. То, на что вы ссылаетесь, обычно называется Despeckle в Document Imaging Applications. Сканеры документов часто вносят много грязи и шума в изображение во время сканирования, поэтому его необходимо удалить, чтобы повысить точность распознавания.

Я предполагаю, что вы обрабатываете ч / б изображения здесь или можете конвертировать ваше изображение в ч / б, иначе это станет намного сложнее. Despeckle делается путем анализа всех пятен на странице. Еще один способ определения размера капли - выбор ширины, высоты и количества пикселей.

Leptonica.com - библиотека с открытым исходным кодом на языке C, в которой есть необходимые функции анализа BLOB-объектов. С помощью некоторых простых проверок и циклов вы можете удалить эти меньшие объекты. Leptonica также может быть легко скомпилирована в программу командной строки. Есть много примеров программ, и это лучший способ выучить Лепсионику.

Для тестирования вы можете попробовать ImageMagick. У него есть опция командной строки для despeckle, но у него нет других параметров. http://www.imagemagick.org/script/command-line-options.php#despeckle

Другой вариант - поискать в Google алгоритмы "despeckle".

1 голос
/ 22 января 2012

Если вы можете использовать openCV, этот фрагмент кода делает то, что вы хотите (т.е. despakle). Вы можете играть с параметрами Size (3,3) в первой строке, чтобы избавиться от больших или меньших шумных артефактов.

Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3,3));
morphologyEx(image, image, MORPH_OPEN, element);
morphologyEx(image, image, MORPH_CLOSE, element);
0 голосов
/ 01 июня 2015

ImageMagick, начиная с версии 6.8.9-10, включает в себя опцию -connected-components, которую можно использовать, чтобы делать то, что вы хотите, однако из примера , представленного на официальном сайте, это не сразу очевидно, как получить исходное изображение за вычетом удаленных подключенных компонентов.

Я почти уверен, что есть более простой способ, но я сделал это с помощью неуклюжего скрипта, выполнив ряд шагов:

  • Сначала я выполнил команду из примера подключенных компонентов:

    convert in.png \
      -define connected-components:verbose=true \
      -connected-components 8 out.png
    
  • Это производит вывод в следующем формате:

    Objects (id: bounding-box centroid area mean-color):
    (...)
    181: 9x9+1601+916 1605.2,920.2 44 gray(0)
    185: 5x5+1266+923 1268.0,925.0 13 gray(0)
    274: 5x5+2276+1661 2278.0,1663.0 13 gray(255)
    
  • Затем я использовал awk для фильтрации только строк, содержащих область (в пикселях) черных компонентов (средний цвет gray(0) в моем изображении), меньшую моего порога $ min_cc_area. Обратите внимание, что connected-components имеет возможность фильтровать компоненты меньше, чем заданная область, но мне нужно было наоборот. Строка awk похожа на следующую:

    {if ($4 < $min_cc_area && $5=="gray(0)") { print $2 }}
    
  • Затем я приступил к созданию командной строки для ImageMagick, в которой я рисовал белые прямоугольники поверх этих подключенных компонентов. Команда -draw ожидает координаты в форме x1,y1 x2,y2, поэтому я снова использовал awk для вычисления координат из координат в формате [w]x[h]+x1+y1, заданном -connected-components:

    awk '{print "white fill rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }'
    
  • Наконец, я запустил созданную командную строку ImageMagick, чтобы создать новое изображение, объединяющее все белые прямоугольники поверх исходного.

В итоге я получил следующий скрипт:

# usage: $0 infile min_cc_area outfile
infile=$1
min_cc_area=$2
outfile=$3
awk_exp="{if (\$4 < $min_cc_area && \$5==\"gray(0)\") { print \$2 }}"

draw_rects=""
draw_rects+=$(convert $infile -define connected-components:verbose=true \
  -connected-components 8 null: | \
  awk "$awk_exp" | tr 'x+' '  ' | \
  awk '{print " rectangle " $3 "," $4 " " $3+$1-1 "," $4+$2-1 }')

convert $infile -draw "fill white $draw_rects" $outfile

Обратите внимание, что это решение может стереть черные пиксели возле удаленных CC, если они вставят ограничивающий прямоугольник удаленного компонента.

0 голосов
/ 14 декабря 2010

Вы просто хотите выяснить площадь каждого компонента.Таким образом, алгоритм отслеживания в 8 направлениях может помочь.У меня есть API, чтобы решить эту проблему, написанную на C ++.Если хотите, отправьте мне письмо.

0 голосов
/ 10 декабря 2010

Требуется алгоритм маркировки подключенных компонентов. Он будет сканировать изображение и присваивать каждой подключенной фигуре идентификационный номер, а также назначать каждому пикселю идентификационный номер своей фигуры.

После запуска фильтра подключенных компонентов просто посчитайте пиксели, назначенные каждому объекту, найдите объекты, которые имеют менее 10 пикселей, и замените пиксели в этих объектах белым.

...