目錄
- 冪律(伽馬)變換
冪律(伽馬)變換
s=crγ(3.5)s = c r^{\gamma} \tag{3.5}s=crγ(3.5)
c和γc和\gammac和γ是正常數。考慮到偏移(即輸入為0時的一個可度量輸出),可改寫為s=c(r+?)γs = c (r + \epsilon) ^{\gamma}s=c(r+?)γ
用于獲取、打印和顯示圖像的許多設備的響應遵守冪律。用于校正這些冪律響應現象的處理稱為伽馬校正或伽馬編碼。
我們感興趣的是曲線的形狀,而不是它們的相對值
# 伽馬變換不同伽馬值的圖像,為了圖像好看,縮放到相同的數值范圍
x = np.arange(0, 256, 1)
epsilon = 1e-5
gammas = [0.04, 0.10, 0.2, 0.40, 0.67, 1, 1.5, 2.5, 5.0, 10, 25]fig = plt.figure(figsize=(6, 6))
ax = fig.gca()
for gamma in gammas:n_power = normalize(np.power(x + epsilon, gamma)) * 255ax.plot(x, n_power, label='$\gamma = {}$'.format(gamma))ax.legend(loc='best')
plt.ylim([0, 255])
plt.xlim([0, 255])
plt.show()
def gamma_transform(img, c, gamma):"""gamma transform 2d grayscale image, convert uint image to floatparam: input img: input grayscale image param: input c: scale of the transformparam: input gamma: gamma value of the transoform"""img = img.astype(float) #先要把圖像轉換成為float,不然結果點不太相同epsilon = 1e-5 #非常小的值以防出現除0的情況img_dst = np.zeros(img.shape[:2], dtype=np.float)img_dst = c * np.power(img + epsilon, gamma)img_dst = np.uint8(normalize(img_dst) * 255)return img_dst
# 冪律(伽馬)變換1
img = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0308(a)(fractured_spine).tif', 0)c = 1
gammas = [1.0, 0.04, 0.1, 0.3, 0.2, 0.4, 0.67, 0.9, 1.5, 2.5, 5, 10]
gama_len = len(gammas)fig = plt.figure(figsize=(15, 26))
for i in range(gama_len):ax = fig.add_subplot(4, 3, i+1, xticks=[], yticks=[])img_gamma= gamma_transform(img, c, gammas[i])ax.imshow(img_gamma, cmap='gray')if gammas[i] == 1.0:ax.set_title("Original")else:ax.set_title(f"$\gamma={gammas[i]}$")plt.tight_layout()
plt.show()
# 冪律(伽馬)變換2
img = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0309(a)(washed_out_aerial_image).tif', 0)
c = 1
gammas = [1.0, 0.1, 0.3, 0.2, 0.4, 0.67, 0.9, 1.5, 3, 4, 5, 10]
gama_len = len(gammas)fig = plt.figure(figsize=(15, 21))
for i in range(gama_len):ax = fig.add_subplot(4, 3, i+1, xticks=[], yticks=[])img_gamma= gamma_transform(img, c, gammas[i])ax.imshow(img_gamma, cmap='gray')if gammas[i] == 1.0:ax.set_title("Original")else:ax.set_title(f"$\gamma={gammas[i]}$")plt.tight_layout()
plt.show()