将标量添加到图像时破坏图像像素

问题描述 投票:0回答:1

我想通过添加标量来调整图像的亮度

我写了这段代码。

img1 = np.uint8(np.clip(img + 45, 0, 255))
img2 = np.uint8(np.clip(img + 45., 0, 255))

plt.imshow(img1) 
plt.show()
plt.imshow(img2)
plt.show()

img1img2之间的唯一区别是加法值的类型。

img1添加整数img2添加浮点数

但是结果不同。

您可以在下面的链接中查看结果

https://www.dropbox.com/s/vd6talup5nre312/pixel_diff.png?raw=1

我不明白为什么添加整数会损坏像素。甚至我都用np.clip

剪切了值

有人可以告诉我为什么吗?谢谢!

python image numpy opencv
1个回答
1
投票

您超出了允许的范围。

»但是我正在使用np.clip()并将其转换为uint8!«你想说的。

对,但为时已晚。您的img可能已经是uint8类型,并且只要将整数添加到整数中,该类型就不会更改,因此第一次添加img + 45会在45范围内添加uint8 ,并且已经发生了溢出(例如231 + 45 → 276 → 20)。以后np.clip()不会更改任何内容(因为20已在范围内)。

您实际上可以通过多种方式正确地做到这一点。通过添加浮点值找到了一个。这将自动将uint8转换为浮点值prior以执行加法。然后其余的将按预期进行(剪切,向下转换)。

您还可以在uint8范围内进行加法,然后检查是否有溢出值(<45?),并将所有这些值设置为最大值(255)。但是我想这是不必要的复杂,除非您遇到例如内存问题(如果您不能将图像作为浮点保存在内存中)。在正常情况下,这可能没问题。

您还可以使用np.clip(img, 0, 255-45) + 45首先避免溢出。但是我认为对于下一个维护人员来说,这也不容易理解,因此在专业环境中,这并不像第二种方法那样使用浮点转换和向下转换。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.