图像的幂律(伽马)变换是一种常用的图像增强技术,通常用于调整图像的对比度。这种变换通过对图像中每个像素的灰度值进行非线性映射来实现。
幂律变换的数学表达式如下所示:
使用幂律变换时,较小的灰度值将被映射到更小的值,而较大的灰度值则会被映射到更大的值,以拉伸或压缩图像的灰度范围。较大的 γ 值将导致对比度增强,而较小的 γ 值将使对比度减弱。
原图用opencv读入后,分别以小于1的γ值和大于1的γ值对其进行灰度变换。Python中幂律运算可用**运算符表示。实验不同的γ值对图像对比度的不同作用,8次灰度变换完成后,用pyplot同时显示所有结果图。
import cv2
import math
import sys
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread("Fig0308.tif")
img2=cv2.imread("Fig0309.tif")
if img1 is None:
sys.exit("could not read the image")
if img2 is None:
sys.exit("could not read the image")
def gammaTranform(c,gamma,image):
h,w,d = image.shape[0],image.shape[1],image.shape[2]
new_img = np.zeros((h,w,d),dtype=np.float32)
for i in range(h):
for j in range(w):
new_img[i,j,0] = c*math.pow(image[i, j, 0], gamma)
new_img[i,j,1] = c*math.pow(image[i, j, 1], gamma)
new_img[i,j,2] = c*math.pow(image[i, j, 2], gamma)
cv2.normalize(new_img,new_img,0,255,cv2.NORM_MINMAX)
new_img = cv2.convertScaleAbs(new_img)
return new_img
new_img1 = gammaTranform(1,1,img1)
new_img2= gammaTranform(1,0.6,img1)
new_img3= gammaTranform(1,0.4,img1)
new_img4= gammaTranform(1,0.3,img1)
new_img5 = gammaTranform(1,1,img2)
new_img6= gammaTranform(1,2,img2)
new_img7= gammaTranform(1,3,img2)
new_img8= gammaTranform(1,4,img2)
plt.subplot(241),plt.imshow(new_img1),plt.title("new_img1")
plt.subplot(242),plt.imshow(new_img2),plt.title("new_img2")
plt.subplot(243),plt.imshow(new_img3),plt.title("new_img3")
plt.subplot(244),plt.imshow(new_img4),plt.title("new_img4")
plt.subplot(245),plt.imshow(new_img5),plt.title("new_img5")
plt.subplot(246),plt.imshow(new_img6),plt.title("new_img6")
plt.subplot(247),plt.imshow(new_img7),plt.title("new_img7")
plt.subplot(248),plt.imshow(new_img8),plt.title("new_img8")
plt.show()
伽马变换可以很好地拉伸图像的对比度,扩展灰度级。
由图可知,
当图像的整体灰度偏暗时,选择γ<1,可以使图像增亮;
当图像的整体灰度偏亮时,选择γ>1,可以使图像变暗,
提高图像的对比度,凸显细节。