线性图像校正后图像显示为黑色的原因排查求助
线性校正后图像显示黑色的问题分析与解决
问题现象
原始图像可正常显示,但经过线性校正后的图像显示为全黑。
原始代码
import cv2 import numpy as np from google.colab import drive from google.colab.patches import cv2_imshow # Uploading an image drive.mount("/content/drive") img = cv2.imread('./drive/MyDrive/python/bird/maxresdefault.jpg', cv2.IMREAD_GRAYSCALE) # Calculating the minimum and maximum pixel values r_min = np.min(img) r_max = np.max(img) # Linear image correction img_corrected = (img - r_min) * 255 / (r_max - r_min) # Converting an image to an 8-bit format img_corrected = np.uint8(img_corrected) img_corrected = cv2.cvtColor(img_corrected, cv2.COLOR_BGR2RGB) # Displaying the original and corrected images cv2_imshow(img) cv2.imwrite("./drive/MyDrive/python/bird/corrected_image.jpg", img_corrected) img_corrected = cv2.imread("./drive/MyDrive/python/bird/corrected_image.jpg") cv2.waitKey(0) cv2.destroyAllWindows()
图像对比
原始图像:
校正后黑色图像:
错误原因
单通道灰度图误用BGR转RGB转换
代码读取的是单通道灰度图,但后续调用cv2.cvtColor(img_corrected, cv2.COLOR_BGR2RGB),该转换仅适用于3通道BGR图像。单通道图像执行此操作会生成不符合预期的3通道数据,最终保存后显示为全黑。冗余的图像保存读取操作
校正后的图像可直接显示,无需先保存再读取;且OpenCV默认以BGR格式写入图像,转RGB后保存会导致颜色异常。未处理除零异常
若图像所有像素值相同(r_max == r_min),会触发除法错误。
修正后的代码
import cv2 import numpy as np from google.colab import drive from google.colab.patches import cv2_imshow # 挂载Google Drive并读取灰度图像 drive.mount("/content/drive") img = cv2.imread('./drive/MyDrive/python/bird/maxresdefault.jpg', cv2.IMREAD_GRAYSCALE) # 计算像素极值并处理除零情况 r_min = np.min(img) r_max = np.max(img) if r_max == r_min: img_corrected = img else: # 线性拉伸校正 img_corrected = (img - r_min) * 255 / (r_max - r_min) img_corrected = np.uint8(img_corrected) # 显示原始图像与校正图像 cv2_imshow(img) cv2_imshow(img_corrected) # 保存校正后的灰度图像 cv2.imwrite("./drive/MyDrive/python/bird/corrected_image.jpg", img_corrected) cv2.waitKey(0) cv2.destroyAllWindows()
修改说明
- 移除错误的
COLOR_BGR2RGB转换,保留灰度图的单通道格式 - 添加
r_max == r_min的判断,避免除零错误 - 直接显示校正后的图像,省去不必要的保存后读取步骤
- 直接保存单通道灰度图像,确保图像正常显示
内容的提问来源于stack exchange,提问作者Mosh Tumuch
相关产品推荐
相关产品推荐

