我有一个二进制图像,为简单起见,我们假设它是一个简单的直线:
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 algorithm和Guo-Hall algorithm,我也试过了由skimage暴露的Otsu方法,这产生了类似的结果。
有人可以告诉我有关瘦身算法的存在,这可以让我在哪里,或者可能采用不同的方法吗?
更新(以解决@marinus评论):
如上所述,我喜欢扩展2px的初始行并获得:
00000000000000
00000000000000
00000000000000
11111111111100
00000000000000
00000000000000
00000000000000
虽然我不能采用我的细化方法,因为细化似乎是这样的:
因此,通过扩展初始线,我不可能通过细化来扩展它。
答案 0 :(得分:1)
答案在于您正在使用的形态学内核。在您的示例中,您提到您只想在水平方向上将线延伸两个像素。您应用的内核应符合您的目标。
对于拨号,每个“开”像素都是当前像素及其与内核的邻居。 3x3内核将在当前像素周围生成1。
3x3:
111
111
111
相反,如果你应用了一个5x1的内核:
00000
11111
00000
将它应用于您的原始信号,您将获得所需的结果。如果你只想在右边添加像素,那么做内核为111,内核的中心位于第一个像素上。
答案 1 :(得分: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=[];
}}
参考文献:
jsAscii - 使用Javascript和Canvas的图像中的ASCII艺术将图像转换为点http://blog.nihilogic.dk/2008/03/jsascii.html