1.图像的线性变换
图像的线性变换
S
=
k
×
r
+
b
S=k\times r+b
S=k×r+b
其中
r
r
r 为输入变量,
S
S
S为输出变量,
k
,
b
k,b
k,b为线性变换中的倍数因子和偏移因子。
当
0
<
k
<
1
0<k<1
0<k<1时,对灰度压缩,整体变灰变暗。
当
k
=
1
,
b
=
0
k=1,b=0
k=1,b=0时,和原图像相同。
当
k
>
1
k>1
k>1时,对灰度拉伸,对比明显,变亮。
当
k
<
0
k<0
k<0时,亮处变暗,暗处变亮。
代码实现:
k=-1
b=50
img2=b + k*img.astype(np.int32)#要进行类型转化,因为uint8在+1时可能会溢出错误
img2=np.clip(img2,0,255)#对溢出值做一个截断,当大于255时取255,小于0时取0,以保证灰度区间在0-255
k=0.1
b=50
img3=b + k*img.astype(np.int32)
img3=np.clip(img3,0,255)
k=2
b=50
img4=b + k*img.astype(np.int32)
img4=np.clip(img4,0,255)
show(np.hstack([img2,img,img3,img4]))
效果展示(k=-1,k=1,k=0.1,k=2)
2.图像的非线性变换
图像的非线性变换常有对数变化和gamma变化(指数变换,幂次变换)。
1)对数变换
对数变换的公式为:
S
=
c
×
l
o
g
(
r
+
1
)
S=c\times log(r+1)
S=c×log(r+1)
其中
r
r
r 为输入变量,
S
S
S为输出变量,
c
c
c为线性变换中的倍数因子。
可见,灰度较低时对灰度进行拉伸,灰度较高时则灰度压缩。
代码实现:
img4=10+np.log(img.astype(np.float32)+1)/0.1#同样的,log内可能会0会出现错误,故进行浮点转换+1
1)gamma变换
对数变换的公式为:
S
=
c
×
r
γ
S=c\times r^{\gamma}
S=c×rγ
其中
r
r
r 为输入变量,
S
S
S为输出变量,
c
,
γ
c,\gamma
c,γ为线性变换中的倍数因子和指数因子。
当
γ
>
1
\gamma>1
γ>1时,拉伸图像中灰度级较高的区域,压缩灰度级较低的部分
当
γ
<
1
\gamma<1
γ<1时,压缩图像中灰度级较高的区域,拉伸灰度级较低的部分
代码实现:
r=img/255#归一化,使r为0-1间的数值
img5=np.power(r,0.5)*255
img6=np.power(r,2)*255
效果展示(r=0.5, r=1, r=2):