幂律变换

2022-05-28 16:45:22 浏览数 (1)

代码语言:javascript复制
import cv2
import math
import imutils
import numpy as np
o=cv2.imread('C:/Users/xpp/Desktop/Lena.png')#原始图像
cv2.imshow("original",o)
gamma=np.zeros((o.shape[0],o.shape[1],3),dtype=np.float32)#幂律变换
for i in range(o.shape[0]):
    for j in range(o.shape[1]):
        gamma[i,j,0]=math.pow(o[i,j,0],0.4)
        gamma[i,j,1]=math.pow(o[i,j,1],0.4)
        gamma[i,j,2]=math.pow(o[i,j,2],0.4)
cv2.normalize(gamma,gamma,0,255,cv2.NORM_MINMAX)#图像归一化
gamma=cv2.convertScaleAbs(gamma)
cv2.imshow("result",gamma)        
cv2.waitKey()
cv2.destroyAllWindows()

算法:幂律变换是是非线性变换。幂律变换应用在图像校正,对漂白的图片或者是过黑的图片进行修正。

幂律对数变换的一般形式为:

s=T(r)=c*r^γ

其中,r为原始图像灰度值,γ为幂指数,c为尺度比较常数,s为幂律变换后的目标灰度值。

考虑到偏移量ε:

s=T(r)=c*(r ε)^γ

例子:

r>1的值所生成的曲线和r<1的值所生成的曲线的效果完全相反。当c=r=1时简化成了恒等变换。

根据γ的大小,一般分为以下两种情况:

  • γ > 1: 处理漂白的图片,进行灰度级压缩
  • γ < 1: 处理过黑的图片,对比度增强,凸显出细节

注意:参数r和s的取值范围为[0,1]。

0 人点赞