栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python提取二值栅格上边界和中线

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python提取二值栅格上边界和中线

比较简单粗暴的方法…缺点就是提取上边界的时候有一些细碎的像元还是没办法删去,如果图案过分扭曲,效果就差很多。(初学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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530210.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号