PIL拆分的绿色通道传入OpenCV CLAHE报错Expected cv::UMat如何解决?
错误原因
这个报错是因为cv.createCLAHE().apply()方法要求输入的源图像为OpenCV支持的cv::UMat类型或者uint8格式的numpy数组,而你通过PIL的Image.split()拆分得到的multiBands[1]是PIL的Image对象,类型不匹配导致报错。
解决步骤
- 先将PIL格式的绿色通道转为numpy数组,适配OpenCV的接口要求
- CLAHE处理完成后,将输出的numpy数组转回PIL Image对象,才能调用PIL的
point()方法执行后续的对比度拉伸操作 - 额外导入numpy库用于格式转换
修改后完整代码
# 对比度拉伸Python示例程序 from PIL import Image import cv2 as cv import numpy as np # 新增numpy导入 # 处理图像绿色通道的方法 def normalizeGreen(intensity): iI = intensity minI = 90 maxI = 225 minO = 0 maxO = 255 iO = (iI-minI)*(((maxO-minO)/(maxI-minI))+minO) return iO # 创建图像对象 imageObject = Image.open("input/IDRiD_02.jpg") # 拆分图像的红、绿、蓝通道 multiBands = imageObject.split() # 创建CLAHE对象(参数为可选) clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) # PIL通道转numpy数组适配OpenCV接口 green_np = np.array(multiBands[1], dtype=np.uint8) cl_np = clahe.apply(green_np) # numpy数组转回PIL Image适配后续PIL方法调用 cl = Image.fromarray(cl_np) # 对各颜色通道执行对比度拉伸点操作 normalizedGreenBand = cl.point(normalizeGreen) # 显示对比度拉伸前的图像 imageObject.show() # 显示对比度拉伸后的图像 normalizedGreenBand.show()
内容的提问来源于stack exchange,提问作者Kadek Angga
相关产品推荐
相关产品推荐

