我想通过添加标量来调整图像的亮度
我写了这段代码。
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()
img1
和img2
之间的唯一区别是加法值的类型。
img1
添加整数,img2
添加浮点数。
但是结果不同。
您可以在下面的链接中查看结果
https://www.dropbox.com/s/vd6talup5nre312/pixel_diff.png?raw=1
我不明白为什么添加整数会损坏像素。甚至我都用np.clip
有人可以告诉我为什么吗?谢谢!
您超出了允许的范围。
»但是我正在使用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
首先避免溢出。但是我认为对于下一个维护人员来说,这也不容易理解,因此在专业环境中,这并不像第二种方法那样使用浮点转换和向下转换。