Improved Adaptive Gamma Correctionを使っているのですが,
このコードは自動でガンマ補正してくれるコードです。
暗い画像は明るくし、明るい画像は暗いところを作成します。
しかし、私の用意した暗い画像や明るい画像は変更なしになってしまいます。
python
1import cv2 2import glob 3import argparse 4import numpy as np 5from matplotlib import pyplot as plt 6from scipy.linalg import fractional_matrix_power 7 8def image_agcwd(img, a=0.25, truncated_cdf=False): 9 h,w = img.shape[:2] 10 hist,bins = np.histogram(img.flatten(),256,[0,256]) 11 cdf = hist.cumsum() 12 cdf_normalized = cdf / cdf.max() 13 prob_normalized = hist / hist.sum() 14 15 unique_intensity = np.unique(img) 16 intensity_max = unique_intensity.max() 17 intensity_min = unique_intensity.min() 18 prob_min = prob_normalized.min() 19 prob_max = prob_normalized.max() 20 21 pn_temp = (prob_normalized - prob_min) / (prob_max - prob_min) 22 pn_temp[pn_temp>0] = prob_max * (pn_temp[pn_temp>0]**a) 23 pn_temp[pn_temp<0] = prob_max * (-((-pn_temp[pn_temp<0])**a)) 24 prob_normalized_wd = pn_temp / pn_temp.sum() # [0,1]に正規化 25 cdf_prob_normalized_wd = prob_normalized_wd.cumsum() 26 27 if truncated_cdf: 28 inverse_cdf = np.maximum(0.5,1 - cdf_prob_normalized_wd) 29 else: 30 inverse_cdf = 1 - cdf_prob_normalized_wd 31 32 img_new = img.copy() 33 for i in unique_intensity: 34 img_new[img==i] = np.round(255 * (i / 255)**inverse_cdf[i]) 35 36 return img_new 37 38def process_bright(img): 39 img_negative = 255 - img 40 agcwd = image_agcwd(img_negative, a=0.25, truncated_cdf=False) 41 reversed = 255 - agcwd 42 return reversed 43 44def process_dimmed(img): 45 agcwd = image_agcwd(img, a=0.75, truncated_cdf=True) 46 return agcwd 47 48def main(): 49 img = cv2.imread('input/IMG841.jpg') 50 51 # 画像の強度成分を抽出 52 YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) 53 Y = YCrCb[:,:,0] 54 # 画像が明るいか暗いかを判断する 55 threshold = 0.3 56 exp_in = 112 # 予想されるグローバル平均強度 57 M,N = img.shape[:2] 58 mean_in = np.sum(Y/(M*N)) 59 t = (mean_in - exp_in)/ exp_in 60 61 # ガンマ補正のための画像処理 62 img_output = None 63 if t < -threshold: # 淡い色合いの画像 64 result = process_dimmed(Y) 65 YCrCb[:,:,0] = result 66 img_output = cv2.cvtColor(YCrCb,cv2.COLOR_YCrCb2BGR) 67 print("淡い色合いの画像") 68 elif t > threshold: # 明るい画像 69 result = process_bright(Y) 70 YCrCb[:,:,0] = result 71 img_output = cv2.cvtColor(YCrCb,cv2.COLOR_YCrCb2BGR) 72 print("明るい画像") 73 else: 74 img_output = img 75 print("変更なし") 76 77 cv2.imwrite('output/IMG841.jpg', img_output) 78 79if __name__ == '__main__': 80 main()
> Improved Adaptive Gamma Correctionを使っているのですが
"Improved Adaptive Gamma Correction" とは何なのか? を概説してください.
「その手法(?)が何なのかというところから調べて答えろ」という話なのですか?
単なる「ガンマ補正」ならまぁ一般的に通じる(?)とは思いますが,
それと比べて一体何がどう Improved で Adaptive なのか?
あなたは当然そこら辺のことを把握しているハズですから,
その知見に基づいたあなたの疑問というのを
「これこれこういう話であるから,右の自分で用意した画像に対してはこういう結果になるハズだと考えているのだが,結果はこうなった.〇〇が××となっているように思われる」
とかなんとか,そのくらいの話を提示してください.
そのコードはなにをするコードなんでしょうか。詳しく説明しましょう
リンク先やそこから辿れる文献にはいくつかの結果例が載っているように見えますが,それらは再現するのですか?
「入力と出力がほぼ変わらない」というのも正当な結果である可能性はあるハズですが,
あなたの画像がそのような入力に該当するということはないのですか?
回答1件
あなたの回答
tips
プレビュー