我有一个二进制图像的牌照。
我对图像进行了扩张,使边缘变粗,然后“填充”#34;最后是减薄的侵蚀:
但我希望我的输出是这样的:
有人可以帮帮我吗?并告诉我如何获得所需的输出。
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 :(得分:6)
您可以通过对imfill
的其他一些巧妙调用来执行此操作。假设您的二进制图像位于数组BW
:
Tmp = imfill(BW, 'holes');
Tmp2 = imfill(Tmp-BW, 'holes');
Res = Tmp - imfill(BW & Tmp2, 'holes');
和Res
是包含所需输出的二进制图像:
答案 1 :(得分: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
以下是各个阶段的表现:
算法是这样的:
co
(一些未使用的颜色)co
co
ci
(一些未使用的颜色)ci
合并/重新着色源和结果图像
从源图像复制边缘,从结果图像复制内部,其余为空格
我将自己的图片类用于图片,因此有些成员是:
xs,ys
图片大小(以像素为单位)
p[y][x].dd
是(x,y)位置的像素,为32位整数类型
clear(color)
- 清除整个图像
resize(xs,ys)
- 将图片大小调整为新分辨率
如果您有包含更多图层的特殊字符
然后只需添加更多阶段... layer
是从大多数内部空间/洞到外部空间可以有多少层空间也可以循环直到找不到更多层...
答案 2 :(得分:-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');