0

我有一个二进制图像,为简单起见,我们假设它是一条简单的直线:

00000000000000
00000000000000
00000000000000
11111111110000
00000000000000
00000000000000
00000000000000

我想将它扩展 2px。

为此,我通过两次迭代应用了膨胀,并且正如预期的那样:

00000000000000
11111111111100
11111111111100
11111111111100
11111111111100
11111111111100
00000000000000

然后,我的想法是简单地应用细化并将初始线延长两个像素。但相反,我得到了缩短的线条,可能是因为线条粗细:

00000000000000
10000000000000
10000000000000
11111111100000
10000000000000
10000000000000
00000000000000

然后我想用菱形结构足迹应用膨胀而不是 3x3 个(),但结果更糟 - 线被缩短了一个像素。

对于细化,我使用了 Zhang-Suen 算法Guo-Hall 算法,我还尝试了 skimage 暴露的 Otsu 方法,得到了类似的结果。

有人可以告诉我细化算法的存在可以让我走向哪里,或者可能是不同的方法吗?


更新(以解决@marinus 评论):

如前所述,我喜欢将初始行延长 2px 并得到:

00000000000000
00000000000000
00000000000000
11111111111100
00000000000000
00000000000000
00000000000000

虽然我不能用我的细化方法,因为细化似乎是这样工作的:

图像

因此,仅通过扩大初始线,我不可能通过细化来扩展它。

4

2 回答 2

1

答案在于您正在使用的形态学内核。在您的示例中,您提到您只想在水平方向上将线延伸两个像素。然后,您应用的内核应该符合您的目标。

对于 dialtion,每个“on”像素都是当前像素及其与内核的邻居。3x3 内核将在当前像素周围产生 1。

3x3:

111
111
111

相反,如果您应用了 5x1 的内核:

00000
11111
00000

将其应用于您的原始信号,您将获得所需的结果。如果您只想将像素添加到右侧,请执行 111 的内核,内核的中心位于第一个像素上。

于 2013-03-22T14:36:38.280 回答
0

javascript.js 中的 Zhang-Suen 细化算法

for(x=0;x<5;x++){
for(n=0;n<2;n++){
for(i=0;i<len;){
p1=pp[i];p2=pp[i-width];p3=pp[i-width+1];
p8=pp[i-1];p9=pp[i-width-1];p4=pp[i+1];
p7=pp[i+width-1];p6=pp[i+width];p5=pp[i+width+1];
/* pixels position  
9   2   3
8   1   4   
7   6   5


*/
zn=0;
b=p2+p3+p4+p5+p6+p7+p8+p9;
if(p2<p3){zn++;}
if(p3<p4){zn++;}
if(p4<p5){zn++;}
if(p5<p6){zn++;}
if(p6<p7){zn++;}
if(p7<p8){zn++;}
if(p8<p9){zn++;}
if(p9<p2){zn++;}
if(b>=2&&b<=6&&zn==1&&p2*p4*p6==0&&p4*p6*p8==0&&n==0){id.push(i);}
if(b>=2&&b<=6&&zn==1&&p2*p4*p8==0&&p2*p6*p8==0&&n==1){id.push(i);}
i++;}
for(i=0;i<id.length;i++){pp[id[i]]=0;}id=[];
}}

结果:// https://lh6.googleusercontent.com/-rtDafT3tJ-Q/UqT6thazqJI/AAAAAAAABPE/b2dc7PQNZ24/w973-h220-no/Screenshot+from+2013-12-09+00%253A58%253A36.png

参考 :

jsAscii - 来自带有 Javascript 和 Canvas 的图像的 ASCII 艺术将图像转换为点http://blog.nihilogic.dk/2008/03/jsascii.html

于 2013-12-08T23:17:40.427 回答