2010-12-10 4 views
1

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

Заранее благодарен!

ответ

2

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

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

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

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

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

3

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

0

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

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

3

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

Чтобы быть более конкретными, необходимо будет видеть примеры.

+0

Является ли эрозия -> циклом дилатации без потерь? – 2010-12-13 19:43:14

0

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

1

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

Mat element = getStructuringElement(MORPH_ELLIPSE, Size(3,3)); 
morphologyEx(image, image, MORPH_OPEN, element); 
morphologyEx(image, image, MORPH_CLOSE, element); 
0

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

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

  • Первого, я запустил команду от подключенного примера компонентов:

    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 

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

Смежные вопросы