numpy 如何对图像进行归一化以消除亮度变化

4xrmg8kj  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(167)

在计算机视觉课程中,老师说首先应该对图像进行归一化,以消除亮度变化。视频https://youtu.be/0WNiYrRjJbM的链接
公式如下所示:
I = I/||I||, where I is an image, ||I|| is the magnitude of this image.
谁能解释一下如何使用Python和任何库来实现这种标准化,例如OpenCV。可能在一些库中已经存在这样的函数并可以使用了?
我认为图像的大小是像m=sqrt(sum(v*v))这样计算的,其中v-是将图像转换为HSV后每个点的值的数组。然后是I=v/m,每个点值除以大小。但这并不管用。看起来很奇怪。
谢谢。

lzfw57am

lzfw57am1#

下面是我编写的执行图像归一化的小代码。

import numpy as np 
import cv2

img = cv2.imread("../images/segmentation/peppers_BlueHills.png")
print("img shape = ", img.shape)
print("img type = ", img.dtype)
print("img[0][0]", img[0][0])

# 2-norm

norm = np.linalg.norm(img)
print("img norm = ", norm)

img2 = img / norm

# here img2 becomes float64, reducing it to float32

img2 = np.float32(img2)
print("img2 type = ", img2.dtype)
print("img2[0][0]", img2[0][0])

cv2.imwrite('../images/segmentation/NormalizedPeppers_BlueHills.tif', img2)
cv2.imshow('normalizedImg', img2.astype(np.uint8))

cv2.waitKey(0)
cv2.destroyAllWindows()
exit(0)
The output looks like below:
img shape =  (384, 512, 3)
img type =  uint8
img[0][0] [64 29 62]
img norm =  78180.45637497904
img2 type =  float32
img2[0][0] [0.00081862 0.00037094 0.00079304]

输出的图像看起来像黑色正方形。然而,例如,在Photoshop中可以均衡亮度,以查看某些东西。每个通道(R、G、B)变为浮点,只有TIFF格式支持它。
对我来说,仍然不清楚将每个像素的亮度除以某个值会给我们带来什么,在本例中,它是图像的2范数值。这只会让图像变得太暗,无法阅读。但它并不能使亮度在整个图像上均匀。你在想什么?

相关问题