矩阵变换,距离函数,斜切的简单python语言numpy实现

矩阵变换,距离函数,斜切的简单python语言numpy实现

简介距离函数

距离函数,在图像中有较为重要的基础作用。在二值图像中,将背景以0像素表示,物体以1表示。

基本算法原理

1.将图像中的物体像素点初始化为0,而背景板初始化为无穷,可以依据实际情况设定一个较大值。在我的例子中,由于矩阵值都很小,所以设置背景初始化为100.
2.创建左上角算子
在这里插入图片描述

点p的位置为开始的矩阵点,这也就是一个算子,AL区域为它的邻域。
计算
在这里插入图片描述
3.创建右下角算子

在这里插入图片描述
BR为像素点p的邻域。
之后做卷积类似的处理

在这里插入图片描述

代码展示(原创代码)`

<textarea readonly=”readonly” name=”code” class=”python”> 
#距离变换算法python语言实现
import numpy as np

#定义第一个算子,右上角算子
def sobel_rl(data):
    c,d = data.shape
    for i in range(c):
        for j in range(d):
            a = []
            e = []
            if c>i-1>= 0:
                a.append((data[i-1,j],i-1,j))
            if c>i -1>=0 and d>j-1>=0:
                a.append((data[i-1,j-1],i-1,j-1))
            if d>j-1>=0:
                a.append((data[i,j-1],i,j-1))
            if 0<=i+1<c and d>j-1>=0:
                a.append((data[i+1,j-1],i+1,j-1))
            if len(a):
                for b in a:
                    e.append(np.min([data[i,j],(b[0]+np.abs(i-b[1])+np.abs(j-b[2]))]))
                data[i,j] = np.min(e)
    return data
# a = np.zeros((3,3))
# for c1 in range(3):
#     for r1 in range(c1+1,3):
#         a[c1,r1] = 100
# a = a + a.transpose()
#定义第二个算子,左下角算子
def sobel_ll(data):
    c,d = data.shape
    for i in range(c):
        for j in range(d):
            a = []
            e = []
            i = c-i-1
            j = d-j-1
            if c>i+1>= 0:
                a.append((data[i+1,j],i+1,j))
            if c>i +1>=0 and d>j+1>=0:
                a.append((data[i+1,j+1],i+1,j+1))
            if d>j+1>=0:
                a.append((data[i,j+1],i,j+1))
            if 0<=i-1<c and d>j+1>=0:
                a.append((data[i-1,j+1],i-1,j+1))
            if len(a):
                for b in a:
                    e.append(np.min([data[i,j],(b[0]+np.abs(i-b[1])+np.abs(j-b[2]))]))
                data[i,j] = np.min(e)
    return data


a = np.array([[100,100,100,100,0,100],[100,100,100,0,100,100],[100,100,100,0,100,100],[100,100,100,100,0,100],[100,100,100,100,100,0],[100,100,100,100,100,0]])

print(a)
dataone = sobel_rl(a)
print(dataone)

datatwo = sobel_ll(dataone)

print(sobel_ll(datatwo))

``结果:
[[4 3 2 1 0 1]
 [3 2 1 0 1 2]
 [3 2 1 0 1 2]
 [4 3 2 1 0 1]
 [5 4 3 2 1 0]
 [6 5 3 2 1 0]]

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值