代码语言: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]。