Python:如何在原始BMP图像上正确绘制矩形而非灰度图?
嘿,这个问题我之前踩过坑!大概率是你在处理过程中不小心把原始BMP转成灰度图了,或者绘图操作是在灰度副本上进行的,最后保存的自然就是带矩形的灰度图啦。下面给你两种常用图像处理库的解决方案,直接在原始BMP上绘制矩形:
方法一:使用PIL(Pillow)库
这是Python里处理图像比较直观的库,步骤很简单:
- 加载原始BMP时不要做灰度转换,
Image.open()会自动保留原始图像的通道数(比如彩色BMP是3通道RGB) - 创建绘图对象直接操作原始图像
- 绘制矩形后保存即可
示例代码:
from PIL import Image, ImageDraw # 加载原始BMP图像,保留原始通道 img = Image.open("original_image.bmp") # 创建绘图对象,直接在原始图像上操作 draw = ImageDraw.Draw(img) # 定义矩形坐标(左上x, 左上y, 右下x, 右下y)和RGB颜色 rect_coords = (50, 50, 200, 200) rect_color = (255, 0, 0) # 红色 # 绘制矩形,可通过width参数设置线条粗细 draw.rectangle(rect_coords, outline=rect_color, width=3) # 保存修改后的图像 img.save("image_with_rect.bmp")
方法二:使用OpenCV库
如果你习惯用OpenCV,注意它的颜色格式是BGR,而且加载时要指定参数避免自动转灰度:
- 用
cv2.IMREAD_UNCHANGED参数加载图像,确保保留所有原始通道数据 - 直接在原始图像数组上绘制矩形
- 保存修改后的图像
示例代码:
import cv2 # 加载原始BMP,IMREAD_UNCHANGED确保不丢失原始通道信息 img = cv2.imread("original_image.bmp", cv2.IMREAD_UNCHANGED) # 定义矩形的左上/右下坐标、BGR颜色和线条粗细 top_left = (50, 50) bottom_right = (200, 200) color = (0, 0, 255) # 红色(OpenCV采用BGR顺序) thickness = 3 # 在原始图像上绘制矩形 cv2.rectangle(img, top_left, bottom_right, color, thickness) # 保存图像 cv2.imwrite("image_with_rect.bmp", img)
关键注意点
- 检查你之前的代码,是不是有类似
convert("L")(PIL)或者cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)的灰度转换操作,如果有,要么去掉,要么确保绘图操作是在原始图像副本上进行,而不是灰度图 - 如果你的BMP是带Alpha通道的4通道图像,只需要把颜色参数改成对应通道格式(比如PIL用
(255,0,0,255),OpenCV用(0,0,255,255))即可
内容的提问来源于stack exchange,提问作者X. Gu
相关产品推荐
相关产品推荐

