标签:采样 样条 Python 代码 nodeVector import
@三次B样条采样Python程序
B样条曲线的公式定义不止一种
这里代码所使用的公式是:
De Boor-Cox
具体的定义大家可以去百度
#三次B样条采样Python程序
该代码是在在深度语义分割预测图上取点,并用准均匀3次B样条曲线对预测边界进行拟合
注意:搬代码中修改拟合顶点个数n
k是阶数
nodeVector是节点向量包含元素个数为n+k+1(首位重复个数为k+1,要求单调不减)。
参考代码连接粘在最下面,可用
该代码总是过零点,故把计算出的第一个点替换为第一个经过的顶点。
import numpy as np
import cv2
from mpmath import diff
import matplotlib.pyplot as plt
gray = cv2.imread('08.png')#输入的图片
def b_spline_basis(i, k, u, nodeVector):
if k == 0:
if (nodeVector[i] < u) & (u <= nodeVector[i + 1]): # 若u在两个节点之间,函数之为1,否则为0
result = 1
else:
result = 0
else:
# 计算支撑区间长度
length1 = nodeVector[i + k] - nodeVector[i]
length2 = nodeVector[i + k + 1] - nodeVector[i + 1]
# 定义基函数中的两个系数
if length1 == 0: # 特别定义 0/0 = 0
alpha = 0
else:
alpha = (u - nodeVector[i]) / length1
if length2 == 0:
beta = 0
else:
beta = (nodeVector[i + k + 1] - u) / length2
# 递归定义
result = alpha * b_spline_basis(i, k - 1, u, nodeVector) + beta * b_spline_basis(i + 1, k - 1, u, nodeVector)
return result
# 在图片上画B样条函数图像
def draw_b_spline(n,k,nodeVector,X,Y,photo):
plt.figure()
basis_i = np.zeros(100) # 存放第i个基函数
rx = np.zeros(100) # 存放B样条的横坐标
ry = np.zeros(100)
for i in range(n): # 计算第i个B样条基函数,
U = np.linspace(nodeVector[k], nodeVector[n], 100) # 在节点向量首尾之间取100个点,u在这些点中取值
#print(U)
j = 0
for u in U:
nodeVector = np.array(nodeVector)
basis_i[j] = b_spline_basis(i, k, u, nodeVector) # 计算取u时的基函数的值
j = j + 1
rx = rx + X[i] * basis_i
ry = ry + Y[i] * basis_i
rx[0]=X[0]
ry[0]=Y[0] #源代码总是过零点,替换原始点
pts = np.dstack((ry,rx))#opencv中图片坐标和获取图片像素点矩阵相反
change=np.zeros((100,1,2))
for z in range(0,100):
change[z][0]=pts[0][z]#把单行多列矩阵转换成多列单行矩阵
cv2.polylines(photo,[np.int32(change)],0,(0,255,255),3)#图像,顶点集,是否闭合,颜色,线宽度,np.int32(change)小数不能找到对应的小数故用int整型转换
cv2.imshow('result',gray)
cv2.waitKey(0)
if __name__ == '__main__':
n =13 #控制多边形顶点数量
c=0
k = 4 #k决定次方数,K-1次
X = np.zeros(13)
Y = np.zeros(13)
nodeVector = [0,0,0,0,0,1, 2, 3,4, 5,6,7,8, 9,9,9,9,9]#节点向量一共是n+k+1个点,要求单调不减节点向量首尾两个端点(U0和Un)重复K+1次,准均匀B样条曲线(过首尾两个端点)
print(gray.shape)#高、宽、通道数
height = gray.shape[0]
weight = gray.shape[1]
channels = gray.shape[2]
#print(gray[100,1000,1])#高100、宽1000、通道数B:0,G:1,R:2
for i in range(5,height,59):#从图片中获取要通过的顶点也就是要拟合的点
for j in range(weight):
if gray[i,j,2]< 128:
X[c]=i
Y[c]=j
c=c+1
break#跳出整个循环
print(X,Y)
draw_b_spline(n,k,nodeVector,X,Y,gray)
链接: Python绘制B样条曲线(De Boor Cox).
标签:采样,样条,Python,代码,nodeVector,import 来源: https://blog.csdn.net/qq_38504109/article/details/117228439
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。