3

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

enter image description here

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

enter image description here

Но я хочу, чтобы мой выход, чтобы быть похожим на это:

enter image description here

Может ли кто-нибудь помочь мне, пожалуйста? И покажите мне, как получить желаемый результат.

ab=imread('test1.png'); 

level=graythresh(ab); 
ab=im2bw(ab,level); 

se=strel('disk',1); 
ab=imdilate(ab,se); 


ab=imfill(ab,'holes'); 
ab=bwmorph(ab,'thin',1); 
ab=imerode(ab,strel('line',3,90)); 

figure();imshow(ab,[]); title('floodFilling'); 
+0

Проводка (соответствующая часть) вашего код может помочь вам получить хороший ответ –

ответ

0

Текст только одного слоя заливки, так что я сделать это в C++, как это:

int x,y,e; 
int c0=0x00000000; // space color 
int c1=0x00FFFFFF; // edge color 
int co=0x00FF0000; // outside tmp color 
int ci=0x000000FF; // inside tmp color 
// grow/flood fill c0 neigbouring c1 with c2 
#define fill(c0,c1,c2)\ 
for (e=1;e;)\ 
for (e=0,y=1;y<pic1.ys-1;y++)\ 
    for ( x=1;x<pic1.xs-1;x++)\ 
    if (pic1.p[y][x].dd==c0)\ 
    if ((pic1.p[y-1][x].dd==c1)\ 
     ||(pic1.p[y+1][x].dd==c1)\ 
     ||(pic1.p[y][x-1].dd==c1)\ 
     ||(pic1.p[y][x+1].dd==c1)) { e=1; pic1.p[y][x].dd=c2; } 
// copy data pic0 is source pic1 is output 
pic1=pic0; 
// 0. draw border rectangle for growth fill start with co 
for (x=0  ,y=0;y<pic1.ys;y++) pic1.p[y][x].dd=co; 
for (x=pic1.xs-1,y=0;y<pic1.ys;y++) pic1.p[y][x].dd=co; 
for (x=0,y=0  ;x<pic1.xs;x++) pic1.p[y][x].dd=co; 
for (x=0,y=pic1.ys-1;x<pic1.xs;x++) pic1.p[y][x].dd=co; 
fill(c0,co,co); // 1. grow outer border 
fill(c1,co,co); // 2. grow outer edges 
fill(c0,co,ci); // 3. create outer fill edge 
fill(c0,ci,ci); // 4. fill the inside 
// 5. merge/recolor 
for (y=0;y<pic1.ys;y++) 
for (x=0;x<pic1.xs;x++) 
    { 
    e=c0; 
    if ((pic0.p[y][x].dd==c1)||(pic1.p[y][x].dd==ci)) e=c1; 
    pic1.p[y][x].dd=e; 
    } 
#undef fill 

Вот как выглядит этапы, как:

  • stages

Алгоритм подобен этому :

  1. нарисовать границы прямоугольника для заливки роста начинаются с co (неиспользуемым цветом)
  2. растет внешние границы до ближайшего края текста с co
  3. заполнить внешние края (они исчезают) с co
  4. создания внешним заполнить края с ci (некоторые неиспользованные цвета)
  5. заполнить внутри с ci
  6. слияния источник/Перекрасить и приводят изображения

    копию края от исходного изображения и внутри от результирующего изображения остального пространство

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


xs,ys размер изображения в пикселях
p[y][x].dd пиксель в точке (х, у) позиции в качестве 32-битового целого типа
clear(color) - очищает все изображение
resize(xs,ys) - изменение размера изображения в новую резолюцию

Если у вас есть специальные символы, которые имеют более слои

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

-1

позвольте использовать этот код, он будет использоваться для вас. благодаря @ spektre.

ab=imread('test1.png'); 

level=graythresh(ab); 
ab=im2bw(ab,level); 

se=strel('disk',1); 
ab=imdilate(ab,se); 
figure();imshow(ab,[]); title('floodFilling'); 
ab1=imfill(ab,'holes'); 
ab1(ab==1)=0; 
figure();imshow(ab1,[]); title('floodFilling'); 
+1

Это не дает ответа на вопрос, вывод полностью отличается от того, что задал ОП. – Ratbert

6

Вы можете сделать это несколькими другими умными звонками до imfill. Вот путь, предполагая, что ваш двоичный образ находится в массиве BW:

Tmp = imfill(BW, 'holes'); 
Tmp2 = imfill(Tmp-BW, 'holes'); 
Res = Tmp - imfill(BW & Tmp2, 'holes'); 

и Res является бинарное изображение, содержащее нужный вывод:

enter image description here

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

  • Нет связанных вопросов^_^