使用OpenCV将图像归一化到[0,1]后显示全黑该如何解决?
问题原因
- cv2.imread 默认读取的图像是
uint8类型,取值范围为0~255 - 直接对uint8类型的图像执行
cv2.normalize指定alpha=0、beta=1时,输出数组默认会保持输入的uint8类型,所有小于1的数值都会被截断为0,仅等于1的像素保留值1,最终整个数组绝大多数值都是0,显示出来就是全黑 - cv2.imshow 显示uint8类型数组时,会直接将数值作为0~255的灰度值渲染,数值1几乎和纯黑无差异
修复方案
场景1:需要保留[0,1]区间的浮点型归一化结果
读取图像后先转换为浮点类型再执行归一化即可:
import cv2 import numpy as np img = cv2.imread('/home/images/' + name).astype(np.float32) norm_image = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F) # 此时norm_image是0~1范围的float32数组,cv2.imshow会自动映射到0~255正常显示 cv2.imshow('normalized', norm_image) cv2.waitKey() cv2.destroyAllWindows()
场景2:仅需正常显示归一化效果,不需要保留[0,1]区间
直接将归一化的目标区间设为0~255,保持uint8类型即可:
import cv2 img = cv2.imread('/home/images/' + name) norm_image = cv2.normalize(img, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U) cv2.imshow('normalized', norm_image) cv2.waitKey() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

