问题是原来的图像显示正确,修正后的图像显示黑色,你知道是什么原因吗?
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()
呈现具有校正的图像和具有校正的图像:第一节第一节第一节第一节第一次
1条答案
按热度按时间gcmastyq1#
在这一行中,
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,这就是问题所在)。例如
或者,更简单(但可读性较低的代码)
强制乘法的结果为浮点数,因为255.0是浮点数。