矩阵变换,距离函数,斜切的简单python语言numpy实现
简介距离函数
基本算法原理
代码展示(原创代码)`
简介距离函数
距离函数,在图像中有较为重要的基础作用。在二值图像中,将背景以0像素表示,物体以1表示。
基本算法原理
1.将图像中的物体像素点初始化为0,而背景板初始化为无穷,可以依据实际情况设定一个较大值。在我的例子中,由于矩阵值都很小,所以设置背景初始化为100.
2.创建左上角算子
点p的位置为开始的矩阵点,这也就是一个算子,AL区域为它的邻域。
计算
3.创建右下角算子
BR为像素点p的邻域。
之后做卷积类似的处理
代码展示(原创代码)`
#距离变换算法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+1j-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-1j+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]]