使用OpenCV Python裁剪截图矩形:背景变黑及直方图异常求助
解决裁剪图像背景为黑色及直方图异常的问题
问题1:裁剪后背景呈现黑色而非白色
你当前用cv2.bitwise_and结合全黑mask的方式,本质是把mask中黑色(像素值0)对应的原图像素全部置为0,也就是黑色。要实现白色背景,更直接的方式是先创建一张全白的画布,再把你需要保留的矩形区域从原图像复制到这张白画布上。
问题2:直方图仅显示零点处的竖线
这有两个核心原因:
cv2.imread读取的图像是BGR格式,直接对整个图像ravel()会把三个通道的像素混合统计,结果没有参考性;- 原代码处理后的图像大部分区域是黑色(像素值0),所以直方图自然只会在0位置出现高峰。我们需要转成RGB格式后分通道绘制直方图,才能看到真实的像素分布。
调整后的完整代码
import cv2 import numpy as np import matplotlib.pyplot as plt # 读取目标图像(cv2默认以BGR格式读取) image = cv2.imread("Screenshot from 2019-11-08 22-02-27.png") # 创建与原图像尺寸、通道数一致的全白背景图 white_background = np.ones_like(image) * 255 # 定义要保留的矩形区域坐标(x1,y1)到(x2,y2) x_start, y_start = 0, 185 x_end, y_end = 1900, 773 # 将原图像的目标区域复制到全白背景上 white_background[y_start:y_end, x_start:x_end] = image[y_start:y_end, x_start:x_end] # 保存处理后的图像 cv2.imwrite("processed.png", white_background) # 用matplotlib显示图像:需将BGR转成RGB格式,否则颜色显示异常 plt.imshow(cv2.cvtColor(white_background, cv2.COLOR_BGR2RGB)) plt.show() # 绘制分通道的RGB直方图 rgb_image = cv2.cvtColor(white_background, cv2.COLOR_BGR2RGB) # 拆分RGB三个通道 red_channel, green_channel, blue_channel = cv2.split(rgb_image) # 分别绘制每个通道的直方图,添加透明度方便区分 plt.hist(red_channel.ravel(), 256, [0, 256], color='red', alpha=0.5, label='Red') plt.hist(green_channel.ravel(), 256, [0, 256], color='green', alpha=0.5, label='Green') plt.hist(blue_channel.ravel(), 256, [0, 256], color='blue', alpha=0.5, label='Blue') plt.xlabel('Pixel Intensity') plt.ylabel('Number of Pixels') plt.legend() plt.show()
关键说明
- 全白背景的创建:
np.ones_like(image)*255确保背景和原图像的尺寸、通道数完全匹配,避免出现拼接错误; - 颜色格式转换:matplotlib默认使用RGB格式显示图像,而OpenCV读取的是BGR,必须转换后才能正确显示颜色;
- 分通道直方图:拆分通道后单独统计,能清晰看到每个颜色通道的像素分布情况,解决了原代码中混合通道导致的异常。
内容的提问来源于stack exchange,提问作者neji123




