В Imagemagick вы можете установить порог на изображении, чтобы он не создавал слишком много шума, затем размыть его, а затем снова порог, чтобы соединить большие области черного цвета.Затем используйте -connected-components
, чтобы отфильтровать небольшие области, особенно белые, а затем найдите ограничивающие рамки черных областей.(Синтаксис Unix bash)
convert image.png -threshold 95% \
-shave 5x5 -bordercolor white -border 5 \
-blur 0x2.5 -threshold 99% -type bilevel \
-define connected-components:verbose=true \
-define connected-components:area-threshold=20 \
-define connected-components:mean-color=true \
-connected-components 4 \
+write tmp.png null: | grep "gray(0)" | tail -n +2 | sed 's/^[ ]*//' | cut -d\ -f2`
Это изображение tmp.png
, которое было создано.Обратите внимание, что я удалил области размером менее 20 пикселей.Отрегулируйте по желанию.Также отрегулируйте размытие по желанию.Вы можете увеличить его, чтобы получить больше связанных областей или меньше, чтобы приблизиться к отдельным строкам текста.Я выбрил 5 пикселей вокруг, чтобы удалить точечный шум в верхней части изображения, а затем добавил белую рамку в 5 пикселей.
Этосписок ограничивающих рамок.
Вот листинг:
267x223+477+123
267x216+136+43
48x522+413+0
266x86+136+317
266x43+136+410
266x66+477+404
123x62+479+346
137x43+142+259
117x43+486+65
53x20+478+46
31x20+606+347
29x19+608+48
26x18+716+347
26x17+256+480
25x17+597+481
27x18+716+47
21x17+381+240
7x7+160+409
Мы можем сделать еще один шаг, рисуя коробки с областями:
boxes=""
bboxArr=(`convert image.png -threshold 95% \
-shave 5x5 -bordercolor white -border 5 \
-blur 0x2.5 -threshold 99% -type bilevel \
-define connected-components:verbose=true \
-define connected-components:area-threshold=20 \
-define connected-components:mean-color=true \
-connected-components 4 \
+write tmp.png null: | grep "gray(0)" | sed 's/^[ ]*//' | cut -d\ -f2`)
num="${#bboxArr[*]}"
for ((i=0; i<num; i++)); do
WxH=`echo "${bboxArr[$i]}" | cut -d+ -f1`
xo=`echo "${bboxArr[$i]}" | cut -d+ -f2`
yo=`echo "${bboxArr[$i]}" | cut -d+ -f3`
ww=`echo "$WxH" | cut -dx -f1`
hh=`echo "$WxH" | cut -dx -f2`
x1=$xo
y1=$yo
x2=$((xo+ww-1))
y2=$((yo+hh-1))
boxes="$boxes rectangle $x1,$y1 $x2,$y2"
done
convert image.png -fill none -strokewidth 2 -stroke red -draw "$boxes" -alpha off image_boxes.png
Увеличьте область порога с 20
еще немного, и вы сможете избавиться от крошечного прямоугольника в нижней левой части вокруг круглой точки, что, я думаю,шум.