numpy 黑色图像代替线性图像校正

oug3syen  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(127)

问题是原来的图像显示正确,修正后的图像显示黑色,你知道是什么原因吗?

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()

呈现具有校正的图像和具有校正的图像:第一节第一节第一节第一节第一次

gcmastyq

gcmastyq1#

img_corrected = (img - r_min) * 255 / (r_max - r_min)

在这一行中,img是一个uint8图像,img-r_min也是,(img-r_min)*255也是(有点随机,因为它溢出了。这实际上是一种生成伪随机数的方法:乘以一个会溢出的数,然后用一个较小的常数来保存余数(aka %),这里隐式地做了,因为它隐式地和(img-r_min)*255 % 256相同,所以这不是伪随机数生成器的理想数,但也不是很理想,但这没关系,重要的是,无论(img-r_min)*255的值是多少,它们都是0和255之间的np.uint8)。
因此,(img_rmin)*255/(r_max-r_min)接近0,因为r_max-r_min对于此图像为244(对于任何正常可见的输入图像,应该非常接近255)。img_corrected由0和1组成。
(You例如,可以通过显示img_corrected*100来检查某些像素确实是1,而大多数是0)。
解决方案是:首先将img转换为计算不会溢出的数据类型,然后将结果转换回uint8(您已经这样做了,但是您的转换是无用的,因为img_corrected已经是一个uint8,这就是问题所在)。
例如

img_corrected = (img.astype(np.float64) - r_min) * 255 / (r_max - r_min)

或者,更简单(但可读性较低的代码)

img_corrected = (img - r_min) * 255.0 / (r_max - r_min)

强制乘法的结果为浮点数,因为255.0是浮点数。

相关问题