使用cv2.imread/Image.fromarray处理PNG图偏蓝,求颜色还原方案
问题原因
OpenCV的cv2.imread()默认将彩色图像以BGR通道顺序存储,而PIL的Image.fromarray()要求输入为RGB通道顺序的数组,通道顺序不匹配导致颜色错位,出现偏蓝现象。
解决方案
方案一:转换通道顺序后再用PIL处理
修改代码,将OpenCV读取的BGR图像转为RGB后再传给PIL:
import cv2 from PIL import Image img = cv2.imread("image.png") # 把BGR通道转换为RGB img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) crop = img_rgb[1280:, 2250:2730] cropped_rendered_image = Image.fromarray(crop) cropped_rendered_image.save("newImageName.png")
方案二:全程使用PIL处理(更简洁)
如果不需要OpenCV的其他功能,直接用PIL完成读取和裁剪,避免通道兼容问题:
from PIL import Image img = Image.open("image.png") # 裁剪参数格式为(左边界, 上边界, 右边界, 下边界),对应原代码的裁剪范围 crop = img.crop((2250, 1280, 2730, img.height)) crop.save("newImageName.png")
针对带透明通道的PNG
如果原图是带透明通道的RGBA格式,需要处理BGRA转RGBA:
import cv2 from PIL import Image # 读取包含透明通道的图像 img = cv2.imread("image.png", cv2.IMREAD_UNCHANGED) # 将BGRA通道转换为RGBA img_rgba = cv2.cvtColor(img, cv2.COLOR_BGRA2RGBA) crop = img_rgba[1280:, 2250:2730] cropped_rendered_image = Image.fromarray(crop) cropped_rendered_image.save("newImageName.png")
内容的提问来源于stack exchange,提问作者user13206968
相关产品推荐
相关产品推荐

