python 对二值化图像中的边缘像素点进行三次B样条曲线拟合,并画图
时间: 2024-05-16 20:13:30 浏览: 112
基于最小二乘法对龙格函数作三次曲线拟合在python中的实现.docx
首先,需要安装以下库:numpy、scipy、matplotlib。
接下来,我们可以先使用OpenCV将二值化图像读入Python中,并提取边缘像素点。代码如下:
```python
import cv2
import numpy as np
# 读入二值化图像
img = cv2.imread('binary_image.png', cv2.IMREAD_GRAYSCALE)
# 提取边缘像素点
edge_points = []
for y in range(img.shape[0]):
for x in range(img.shape[1]):
if img[y, x] == 255:
edge_points.append((x, y))
edge_points = np.array(edge_points)
```
接着,我们使用scipy中的interpolate库进行三次B样条曲线拟合。代码如下:
```python
from scipy import interpolate
# 对x和y分别进行三次B样条曲线拟合
tck, u = interpolate.splprep([edge_points[:, 0], edge_points[:, 1]], s=0, k=3)
# 在曲线上采样100个点
u_new = np.linspace(u.min(), u.max(), 100)
x_new, y_new = interpolate.splev(u_new, tck)
```
最后,我们可以使用matplotlib将原图和拟合曲线画出来。代码如下:
```python
import matplotlib.pyplot as plt
# 画出原图和拟合曲线
plt.imshow(img, cmap='gray')
plt.plot(edge_points[:, 0], edge_points[:, 1], 'ro', markersize=1)
plt.plot(x_new, y_new, 'b-', linewidth=1)
plt.axis('off')
plt.show()
```
完整代码如下:
```python
import cv2
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
# 读入二值化图像
img = cv2.imread('binary_image.png', cv2.IMREAD_GRAYSCALE)
# 提取边缘像素点
edge_points = []
for y in range(img.shape[0]):
for x in range(img.shape[1]):
if img[y, x] == 255:
edge_points.append((x, y))
edge_points = np.array(edge_points)
# 对x和y分别进行三次B样条曲线拟合
tck, u = interpolate.splprep([edge_points[:, 0], edge_points[:, 1]], s=0, k=3)
# 在曲线上采样100个点
u_new = np.linspace(u.min(), u.max(), 100)
x_new, y_new = interpolate.splev(u_new, tck)
# 画出原图和拟合曲线
plt.imshow(img, cmap='gray')
plt.plot(edge_points[:, 0], edge_points[:, 1], 'ro', markersize=1)
plt.plot(x_new, y_new, 'b-', linewidth=1)
plt.axis('off')
plt.show()
```
注意:在上述代码中,我们假设二值化图像中白色像素点为边缘像素点,因此在实际使用中可能需要根据具体情况进行修改。
阅读全文