Python图像处理新手求教:如何正确绘制图像中的白色像素?
问题分析与解决
核心问题点
- 多通道误判:OpenCV默认加载的是BGR三通道图像,你直接用
arr0 == 255会对每个通道单独判断——只要像素的某一个通道值为255,就会被纳入结果,而不是要求三个通道全为255才判定为白色,这是噪点的主要来源。 - 坐标搞反:图像数组的索引是
(行, 列, 通道),你把行(垂直方向)作为x轴、列(水平方向)作为y轴,会导致绘制的图像上下翻转,不符合视觉习惯。 - 绘图方式错误:
plt.plot()会把所有点按顺序连接成折线,直接造成大量杂乱线条,应该用散点图来单独绘制每个像素点。
修正后的代码
import cv2 import numpy as np import matplotlib.pyplot as plt # 加载灰度图(单通道,避免多通道误判) img = cv2.imread('thin.png', cv2.IMREAD_GRAYSCALE) # 找到所有白色像素(单通道下值为255) rows, cols = np.where(img == 255) # 绘图:用散点图,x是列,y是行,同时翻转y轴匹配图像坐标系 plt.scatter(cols, rows, s=1, c='white', edgecolor='none') plt.gca().invert_yaxis() # 翻转y轴,因为图像的行索引从上到下递增,而plt的y轴默认从下到上 plt.gca().set_facecolor('black') # 设置背景为黑色,和原图像一致 plt.show()
可选:如果要保留彩色图像处理
如果必须处理彩色图像,需要判断三个通道都为255:
img = cv2.imread('thin.png') # 判断所有通道都是255,axis=2表示按第三个维度(通道)判断 white_pixels = np.all(img == 255, axis=2) rows, cols = np.where(white_pixels) # 后续绘图和上面一致 plt.scatter(cols, rows, s=1, c='white', edgecolor='none') plt.gca().invert_yaxis() plt.gca().set_facecolor('black') plt.show()
内容的提问来源于stack exchange,提问作者noobstacker
相关产品推荐
相关产品推荐

