【问题标题】:Flood filling for number plate recognition用于车牌识别的洪水填充
【发布时间】:2015-04-02 10:58:23
【问题描述】:

我有一个二值图像的车牌。

我对图像进行了膨胀以加厚边缘,然后“填充”,最后通过侵蚀进行细化:

但我希望我的输出是这样的:

谁能帮帮我,好吗?并告诉我如何获得所需的输出。

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');

【问题讨论】:

  • 发布(相关部分)你的代码可能会帮助你得到一个好的答案

标签: algorithm matlab image-processing flood-fill morphological-analysis


【解决方案1】:

您可以通过其他一些巧妙的呼叫imfill 来做到这一点。这是一种方法,假设您的二进制图像在数组BW中:

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

Res 是包含所需输出的二进制图像:

【讨论】:

    【解决方案2】:

    文本只是单层填充,所以我在 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
    

    这些阶段是这样的:

    算法是这样的:

    1. 为增长填充绘制边框矩形以co 开头(一些未使用的颜色)
    2. 使用co 将外边框增加到最近的文本边缘
    3. co 填充外边缘(它们消失)
    4. 使用ci(一些未使用的颜色)创建外部填充边缘
    5. 在里面填上ci
    6. 合并/重新着色源图像和结果图像

      从源图像复制边缘并从结果图像内部复制,其余为空间

    我将自己的图片类用于图像,所以一些成员是:


    xs,ys 图像大小(以像素为单位)
    p[y][x].dd 是 (x,y) 位置的像素,为 32 位整数类型
    clear(color) - 清除整个图像
    resize(xs,ys) - 将图像调整为新分辨率

    如果您有具有更多层的特殊字符

    然后只需添加更多阶段...layer 是从大多数内部空间/孔到外部空间可以有多少层空间,您也可以循环直到找不到更多层...

    【讨论】:

      【解决方案3】:

      让我们使用它将为您使用的代码。感谢@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');
      

      【讨论】:

      • 这并没有提供问题的答案,输出与OP所要求的完全不同。
      猜你喜欢
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多