opencv imshow放大后看不到像素值_对OpenCV中图片亮度和对比度的一些理解
简单的改变图片的亮度和对比度可以看作一个线性的过程:相当于就是原图像每个像素点对应色彩或灰度的映射。直观上看, 决定了对比度,越大,各像素之间的差别越大,对比度越大。 决定了亮度,越大,各像素整体都变大,亮度提升了。但其实这种表述并不准确,因为在对图像进行线性处理时存在溢出的问题,当值太大时,由于超过数据类型的上限被OpenCV置为特定值(比如CV_8U会被置为255)。对于灰...
·

简单的改变图片的亮度和对比度可以看作一个线性的过程:
但其实这种表述并不准确,因为在对图像进行线性处理时存在溢出的问题,当
另一个层面上,
当
完整的调整代码如下:
import cv2
import numpy as np
img = cv2.imread('connelly.jpg')
# 此处需注意,下面有说明
res = np.uint8(np.clip((2 * (np.int16(img) - 60) + 50), 0, 255))
tmp = np.hstack((img, res)) # 两张图片横向合并显示
cv2.imshow('image', tmp)
cv2.waitKey(0)
输出效果如下:

在用python改变图片的亮度和对比度时,有两个问题需要注意,第一个问题是数据类型,式子中其实有一个乘法,这是极有可能出现溢出的,如果代码是这样res = np.uint8(np.clip((2 * img - 60) + 50), 0, 255))
,就会出现这样的结果:

解决的办法有两个,一是改变img的类型:使用np.int16(img)
代替img
;二是用浮点数2.0
代替2
,这样2.0 * img
的数据类型会自动变成float64
。
print((2.0 * img).dtype) # float64
第二个问题是对于溢出NumPy和OpenCV的处理方式不同:
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x, y)) # 250 + 10 = 260 => 255 --255封顶
print(x + y) # 250 + 10 = 260 % 256 = 4 --会溢出
如果我们使用NumPy处理就需要使用np.clip()
函数将数据限定在0~255。

参考
- https://www.numpy.org.cn/article/other/py_basic_ops.html#%E7%9B%AE%E6%A0%87
- https://blog.csdn.net/abc20002929/article/details/40474807
- https://docs.opencv.org/2.4/doc/tutorials/core/basic_linear_transform/basic_linear_transform.html#basic-linear-transform
更多推荐
所有评论(0)