如何用matplotlib在二值化后的图片上像素点为0的点中央画线
时间: 2023-05-29 20:04:09 浏览: 182
可以使用numpy中的argwhere函数来获取所有像素值为0的点的坐标,然后使用matplotlib中的plot函数在这些点的中央画线。
以下是一个示例代码:
```python
import matplotlib.pyplot as plt
import numpy as np
# 生成随机的二值化图片
img = np.random.randint(0, 2, (100, 100))
# 获取像素值为0的点的坐标
x, y = np.argwhere(img == 0).T
# 在这些点的中央画线
plt.imshow(img, cmap='gray')
plt.plot(x+0.5, y+0.5, 'r.')
plt.show()
```
在这个示例中,我们使用了argwhere函数获取像素值为0的点的坐标。由于matplotlib的坐标系是从左下角开始的,因此我们需要在x和y坐标上加上0.5,使线条在像素点中央绘制。最终结果如下图所示:
![image](https://user-images.githubusercontent.com/87289383/127117075-3d48b3d3-23f3-4e1c-9cd7-059f8a44c7d2.png)
相关问题
python 对二值化图像中的边缘像素点进行三次B样条曲线拟合,并画图
首先,需要安装以下库: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()
```
注意:在上述代码中,我们假设二值化图像中白色像素点为边缘像素点,因此在实际使用中可能需要根据具体情况进行修改。
阅读全文