質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1126閲覧

なぜこの処理になるのかわかりません。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/07 08:13

編集2021/12/14 08:09

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/12/07 08:27 編集

> Improved Adaptive Gamma Correctionを使っているのですが "Improved Adaptive Gamma Correction" とは何なのか? を概説してください. 「その手法(?)が何なのかというところから調べて答えろ」という話なのですか? 単なる「ガンマ補正」ならまぁ一般的に通じる(?)とは思いますが, それと比べて一体何がどう Improved で Adaptive なのか? あなたは当然そこら辺のことを把握しているハズですから, その知見に基づいたあなたの疑問というのを 「これこれこういう話であるから,右の自分で用意した画像に対してはこういう結果になるハズだと考えているのだが,結果はこうなった.〇〇が××となっているように思われる」 とかなんとか,そのくらいの話を提示してください.
y_waiwai

2021/12/07 08:23

そのコードはなにをするコードなんでしょうか。詳しく説明しましょう
fana

2021/12/07 08:33

リンク先やそこから辿れる文献にはいくつかの結果例が載っているように見えますが,それらは再現するのですか? 「入力と出力がほぼ変わらない」というのも正当な結果である可能性はあるハズですが, あなたの画像がそのような入力に該当するということはないのですか?
guest

回答1

0

ベストアンサー

ええと、、変更なしと出力されて変更されていない画像が返ってくるんですよね?
単純にt = (mean_in - exp_in)/ exp_in の結果が-thresholdからthresholdの間にあるだけでは?
print(t)としてその範囲内なら何の問題もない気がします。
で、tはmean_inとexp_inの二つの要素で変わる。mean_inは画像データで変わるようなので、exp_inの値を変えたら結果が変わるんじゃないですか?
追記、修正依頼のところに書かれてる方と同様これがどういうものなのかわかりませんが、コードを見る限りこんなところでしょうか。

投稿2021/12/07 08:41

irognodyci

総合スコア227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/12/08 05:48

ありがとうございます。 pathがうまくいかなかったので、そこの部分を消したのでそのせいで うまくいかないと思っていて、print(t) で見るという基礎を忘れていました。 -0.10276909101577036 という結果が出てきて、正しいことがわかりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問