如何在图像中用圆圈标记强度值低于阈值的像素?
在图像上标记低于阈值的像素的正确方法
我明白你的困扰——直接用plt.plot()处理布尔矩阵肯定行不通,因为它根本没对应到图像的坐标系统。其实散点图完全能解决这个问题,关键是要先精准提取出符合条件的像素坐标,再把这些坐标映射到图像上。
下面是修正后的完整方案:
核心思路
- 用
np.where()从布尔矩阵中提取出所有低于阈值的像素的行(y轴)和列(x轴)坐标 - 利用
plt.scatter()把这些坐标对应到imshow绘制的图像上,用圆圈标记出来 - 注意
imshow的坐标规则:左上角是(0,0),数组的行对应y轴,列对应x轴,所以散点图要把列作为x参数,行作为y参数
完整代码示例
import numpy as np import matplotlib.pyplot as plt # 替换成你自己的矩阵数据 row1 = [3, 1, 4, 2] row2 = [0, 5, 1, 6] row3 = [2, 0, 3, 1] row4 = [7, 2, 0, 4] matrix = np.matrix([row1, row2, row3, row4]) threshold = 1 # 生成低于阈值的布尔掩码 matrix_s = matrix <= threshold # 提取符合条件的像素坐标:返回格式为(y坐标数组, x坐标数组) y_coords, x_coords = np.where(matrix_s) # 绘制原始图像 plt.imshow(matrix, cmap='viridis') plt.colorbar() # 标记目标像素:用空心红圈,边缘加白边让标记更醒目 plt.scatter( x_coords, y_coords, marker='o', color='red', edgecolor='white', s=80, # 圆圈大小 facecolor='none' # 空心,不遮挡下方图像 ) plt.title('Pixels with value ≤ threshold') plt.show()
为什么你的原代码无效?
你之前的plt.plot(matrix_s, marker='o')犯了两个关键错误:
- 直接传入布尔矩阵会被Matplotlib当成一维序列处理,完全没有和图像的二维坐标系统关联
plot()默认会把点连接成线,这显然不是你想要的标记效果
而用np.where()提取坐标后,scatter()就能精准定位每个需要标记的像素,和imshow的坐标系统完全匹配。
内容的提问来源于stack exchange,提问作者vashista




