图像预处理-图像亮度变换
最后更新时间:
文章总字数:
预计阅读时间:
一.亮度变换
首先有两个关联的说法:
亮度调整:像素强度整体变高或者变低。
对比度调整:暗处像素强度变低,亮处像素强度变高,从而拉大中间某个区域范围的显示精度。
opencv中操作这两种变换的公式为:
对比度:需要通过
alpha
、beta
一起控制。亮度:通过
beta
控制。
比如,图像中一点的像素为160,一点为10,我想增强对比度,那就是让这两点差异更大。可以让alpha为1.5,这样两点像素值就分别变成了240和15,然后beta为10,就变成了250和25,差异就更大了。
二.线性变换
cv2.addWeighted(src1, alpha, src2, beta, gamma)
src1:第一张输入图像
alpha:第一个输入图像的权重。
src2:第二张输入图像
beta:第二个输入图像的权重。
gamma:一个标量,将被添加到权重求和的结果上,可用于调整总体亮度。
这里用了之前的颜色加权加法,本用于两张图相加,但其有一个参数gamma
,会作为额外值添加进合并后结果并修改亮度。因此只做亮度变换的话,可以将其中的第二张图设为全黑,权重无所谓;或者设为全白(或其他值),权重设为0。然后根据gamma
值修改亮度。
1 |
|
np.ones_like()
和np.zeros_like()
可以快速生成一张继承原图形状与维度的全黑或值全1的图片,其中传入img图像即可。np.full_like(img,value)
可以生成一张全为指定值(如0.5)的图片。
三.直接像素值修改
numpy.clip(a, a_min, a_max)
对数组中的元素进行限定,将超出指定范围的元素值截断至指定的最小值和最大值之间
a:输入数组。
a_min:指定的最小值,数组中所有小于 a_min 的元素将被替换为 a_min。
a_max:指定的最大值,数组中所有大于 a_max 的元素将被替换为 a_max。
这个API通常完成的是防止像素值溢出的功能,返回一个新图像。
1 |
|
结果:
可以看到,代码中使用了两个astype()
变换,那为什么要这么做呢?
首先,img图像与int类型整数做加法运算时会隐式地将图像中的像素值变换为int64类型,这种隐式的操作容易产生潜在问题,因此使用.astype(int)
显示指定像素值为int32类型来进行加法运算(或者用 np.int32/64 都可以)。
而两者相加之后得到的数值依然是int类型,图像处理函数要求数据类型为unit8,因此在最后还需要加上.astype(np.unit8)来转化。
做到这里,其实有一种更方便的亮度调整方法:
就是创建滑条,用一个滑动的窗口来让亮度根据滑动的位置变化。
1 |
|
trackbar_name : 滑条的名字
window_name : 滑条窗口的名字
trackbar_value : 滑条默认所在的位置(值)
max_value : 滑条最大的范围(值)
def : 对图像操作的方法,该方法只能传入一个参数,就是trackbar_value
1 |
|
结果:
上面的p/255
就是将p这个加入的修改值归一化,然后映射到我们想调整的范围[-255,255]
即总共510的范围里去,最后减去255表示把p的值真正地固定在[-255,255]
中。
并且可以看到,我们创建了change函数传入创建滑条的函数,但是其中有两个参数,创建滑条时会报错。因此这里采用匿名函数强制绑定img在回调函数change上,使得img这个参数能够正确传入。