2013-03-21 91 views
0

我有一个二进制映像,为简单起见让我们假设这是一个简单的直线:寻找具体的细化算法

00000000000000 
00000000000000 
00000000000000 
11111111110000 
00000000000000 
00000000000000 
00000000000000 

,我想扩展它的2px。

为了这个目的,我申请的扩张有两个迭代和预期得到这个:

00000000000000 
11111111111100 
11111111111100 
11111111111100 
11111111111100 
11111111111100 
00000000000000 

然后,我的想法是简单地套用变薄并获得初始行由两个像素延长。但是,相反,我得到了缩短线路,可能是因为线宽:

00000000000000 
10000000000000 
10000000000000 
11111111100000 
10000000000000 
10000000000000 
00000000000000 

我当时以为申请与菱形结构的足迹,而不是3×3的人()扩张,但结果更糟 - 线缩短了一个多像素。

为了减薄,我使用了Zhang-Suen algorithmGuo-Hall algorithm,我也尝试过使用skimage公开的Otsu方法,这种方法产生了类似的结果。

有人能告诉我关于细化算法,可以让我的存在,我当家,也许不同的做法?


更新(解决@marinus评论):

如前所述,我谨向初始行2px的,并得到:

00000000000000 
00000000000000 
00000000000000 
11111111111100 
00000000000000 
00000000000000 
00000000000000 

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

img

所以仅通过扩张初始行,我不可能稀疏扩展。

+0

我无法弄清楚究竟你想。你能给你想要得到的输出吗? – marinus 2013-03-21 22:10:26

回答

1

答案就在您正在使用形态的内核。在你的例子中,你提到你只是想在水平方向上扩展两行像素。你应用的内核应该符合你的目标。

对于dialtion,每一个“上”像素“或运算当前像素和其与内核的邻居。 3x3内核将在当前像素周围产生1。

3x3: 

111 
111 
111 

相反,如果你申请一个内核,这是5X1:

00000 
11111 
00000 

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

+0

谢谢,但我提到要考虑简单的线条作为例子。我的问题是密集的轮廓与空白,而不是这个字面的例子。也许我应该寻找其他方法,然后扩大与稀疏...... – theta 2013-03-22 14:50:09

+0

我不清楚你在找什么,但我的答案也适用于一般情况。如果你有一个你想要的可预测的结果(即基于某种形状的扩张/稀疏),那么内核就是关键。如果你想要根据图像中的组件调整某些东西,那么是的,我想你需要一种不同的方法。 – Noremac 2013-03-22 18:10:16

+0

是的,你的答案很好,因为它解释了我应该尝试各种内核,我会这样做,只是我不希望它与提及的细化算法一起工作,我更多地寻找这样的建议。问题是我有密集的轮廓,有缝隙,可以用三角形闭合,但是它非常复杂,因为结果永远都不正确,所以我尝试了其他各种方法。 – theta 2013-03-22 19:29:42

0

بسماللهالرحمنالرحيم张,孙细化算法中的JavaScript。JS

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 - 从图像ASCII艺术的JavaScript和Canvas转换图像圆点http://blog.nihilogic.dk/2008/03/jsascii.html