如何用Matplotlib获取像素RGB值并提取红色像素生成新图?
Matplotlib识别红色像素问题解答
一、先搞懂你打印的像素值是什么
你打印出来的[0. 0. 0.1]这类值,是归一化后的RGB像素值:
- Matplotlib读图像时,会把原本0-255的RGB整数(比如纯红是(255,0,0))自动转成0到1之间的浮点数
- 每个像素是三个数的数组,分别对应红(R)、绿(G)、蓝(B)三个颜色通道的亮度
- 举个例子:
[1. 0. 0.]就是纯红色,[0. 0. 1.]是纯蓝色,[0.5 0.5 0.5]是灰色
二、简单实现方法(比逐像素循环高效多了)
直接用NumPy做向量运算,完整代码如下:
import matplotlib.pyplot as plt import numpy as np def find_red_pixels(image_path, upper_threshold=100, lower_threshold=50): """找出图像里的红色像素,生成只含红色像素的二值图并保存""" # 读取图像,Matplotlib默认读成RGB格式,像素值归一化到0-1 img = plt.imread(image_path) # 把0-1的浮点数转成0-255的整数,方便用常用阈值判断 img_255 = (img * 255).astype(np.uint8) # 红色像素判断逻辑:红通道够亮,绿、蓝通道够暗 # 可根据实际图像调整阈值,比如红色偏暗就调低lower_threshold red_mask = (img_255[:, :, 0] > lower_threshold) & \ (img_255[:, :, 1] < upper_threshold) & \ (img_255[:, :, 2] < upper_threshold) # 创建结果图:红色像素位置设为白色,其他区域全黑 red_img = np.zeros_like(img_255) red_img[red_mask] = [255, 255, 255] # 保存生成的图片 plt.imsave("map-red-pixels.jpg", red_img) return red_img # 调用时替换成你的图像路径即可 find_red_pixels("你的图片路径.jpg")
代码关键点说明
plt.imread()读图自动转为RGB格式,不用手动调整通道顺序- 转回0-255整数是因为咱们平时习惯用这个范围的颜色值,阈值调整更顺手
- 布尔掩码
red_mask能一次性筛选出所有符合条件的红色像素,比逐像素循环效率高很多 - 生成的二值图中,原红色像素位置显示白色,其余区域为黑色,直观易懂
三、额外小提示
- 如果图像是用OpenCV读取的,默认是BGR格式,需要先转成RGB:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) - 阈值不是固定值:若结果杂色多,就提高
upper_threshold;若漏选红色,就降低lower_threshold
内容的提问来源于stack exchange,提问作者Franklin Hole
相关产品推荐
相关产品推荐

