
比较简单粗暴的方法…缺点就是提取上边界的时候有一些细碎的像元还是没办法删去,如果图案过分扭曲,效果就差很多。(初学python…代码冗长繁琐[扶额])
适用于值为0和1的栅格图像。
1.提取上边界
原图像:
提取后:
代码:
def Get_UpperBoundary(dataarray,rows,cols):
boundary=dataarray.copy()
boundary[boundary > 0] = 0
for i in range(cols-1):
for j in range(rows-1):
if (dataarray[j, i] != 0) and (((dataarray[j-1, i] == 0) and (dataarray[j,i-1]==0)) or ((dataarray[j-1,i]==0) and (dataarray[j,i+1]==0)) or ((dataarray[j-1,i]==0) and (dataarray[j-1,i-1]==0))or ((dataarray[j-1,i]==0) and (dataarray[j-1,i+1]==0))):
boundary[j, i] = 1
for i in range(cols-1):
for j in range(rows-1):
if (dataarray[j, i] != 0):
boundary[j, i] = 1
break
#删去底部多余的像元点
for i in range(cols-1):
a = 0; b = []; c = []
c = np.array(c)
# 提取出非0点的位置
for j in range(rows-1):
if(boundary[j, i] != 0):
b.append(j)
a = a+1
if(a>1):
for k in range(len(b) - 1):
a = b[k + 1] - b[k] # 后者减前者
c = np.append(c, a) # 添加元素到新列表
#差值大于5像元之后的其他像元会被剔除
c[c > 5] = 999;t=0
for n in range(len(c)):
if(c[n] == 999):
t += 1;a = int(n+1)
break
if(t!=0):
aa = int(len(b)-1)
if(a == aa):
boundary[b[a], i] = 0
for m in range(a, aa):
boundary[b[m], i] = 0
return boundary
2.提取中线
原图像同上
提取后:
代码:
def Get_MedianBoundary(dataarray,rows,cols):
boundary=dataarray.copy()
boundary[boundary > 0] = 0
for i in range(cols-1):
b = 0
d = 0
for j in range(rows-1):
if (dataarray[j,i]!=0) :
b += j
d = d + 1
if(d!=0):
boundary[b//d, i] = 1
return boundary
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)