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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

Q&A

解決済

1回答

2175閲覧

画像を正規化すると元の色味が変わってしまう

Tetsuya_Kosaka

総合スコア1

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

0グッド

0クリップ

投稿2021/07/12 22:37

編集2021/07/12 23:35

前提・実現したいこと

入力された画像を分割し、いろいろな処理をした後に分割された画像を結合し元に戻す、
というプログラムを作っています。

発生している問題

しかし、入力された画像と、結合し出力された画像では色味が異なり、正しく処理できていない状態にあります。

思い当たる節として、入力データをテンソルに変換→正規化→(処理)→正規化を解く

このどれかの処理がうまくいっていないものとみています(プログラムでは27, 29, 37行目)。

どの行の処理がうまくできていないのかわかる方がいらっしゃいましたら、ご教授いただけないでしょうか。

宜しくお願い致します。

###入力画像
イメージ説明

###出力される画像
イメージ説明

該当のソースコード

python

1import numpy as np 2import cv2 3import tensorflow as tf 4 5def main(): 6 i = 0 7 n = 10 8 pro_height = 3000 9 pro_width = 4000 10 hd_height = 2160 11 hd_width = 3480 12 stock_img = [] 13 d = [] 14 y0 = int(pro_height/n) 15 x0 = int(pro_width/n) 16 17 img = cv2.imread('./image/image.png') 18 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 19 lr_h, lr_w = img.shape[0], img.shape[1] 20 21 # 画像分割 22 if lr_h < lr_w: 23 r_img = cv2.resize(img, (pro_width, pro_height)) 24 a = [r_img[y0*y:y0*(y+1), x0*x:x0*(x+1)] for y in range(n) for x in range(n)] 25 26 # ===怪しいところ(27, 29, 37行目)=== 27 b = tf.convert_to_tensor(a, np.float32) 28 # 正規化 29 c = (b.numpy() - 127.5) / 127.5 30 31 # ================= 32 # ===その他の処理=== 33 # ================= 34 35 # 正規化を解く 36 d = np.clip((c) * 255, 0, 255).astype(np.uint8) 37 # ================ 38 39 40 # 画像結合 41 for _ in range(n): 42 img = [d[x+i] for x in range(n)] 43 img_x = cv2.hconcat(img) 44 stock_img.append(img_x) 45 i += n 46 47 image = cv2.vconcat(stock_img) 48 image = cv2.resize(image, (hd_width, hd_height)) 49 cv2.imwrite('./result_{0}.png'.format(n), image) 50 51if __name__ == '__main__': 52 main()

試したこと

18行目のimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)を変更してみたり、29, 36行目の値を変更してみたり、いろいろ試しましたが、うまくいきませんでした。

###改善(jbpd0さん)
コメントしていただきありがとうございます。
指摘箇所を変更し実行した結果を下記に示します。
イメージ説明

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

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

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

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

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

jbpb0

2021/07/12 23:04 編集

c = (b.numpy() - 127.5) / 127.5 で、値が-1.0〜1.0になってます 「その他の処理」で、それが変わってないのが前提ですが、 d = np.clip((c) * 255, 0, 255).astype(np.uint8) ↓ 変更 d = np.clip(c * 127.5 + 127.5, 0, 255).astype(np.uint8) で、どうでしょうか?
Tetsuya_Kosaka

2021/07/12 23:40

コメントありがとうございます。 ご指摘の通り当該箇所を変更し実行しました。多少改善されましたが、まだ不完全でありました。画像のほうは上記本文中に載せましたのでそちらをご確認お願い致します >「そのほかの処理」でそこが変わっていないことが前提ですが、 はい。その個所では色味の変更を行う処理はありません。 お手数おかけしますが、宜しくお願い致します
jbpb0

2021/07/12 23:43

「そのほかの処理」を全部スキップして実行したら、どうなりますか?
Tetsuya_Kosaka

2021/07/12 23:46

実行したプログラムは上記のものと同じで、その他の処理は実行していません。
jbpb0

2021/07/12 23:50 編集

cv2.imwrite('./result_{0}.png'.format(n), image) のすぐ上に、 image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) を追加してください
Tetsuya_Kosaka

2021/07/12 23:50

コメントありがとうございます。 すみませんcv2.ctvColor(img, cv2.COLOR_BGR2RGB)を抜いて処理したら元通りの画像になりました!
jbpb0

2021/07/12 23:56 編集

cv2.ctvColor(img, cv2.COLOR_BGR2RGB) が要るかどうかは、「そのほかの処理」次第ですね もし、やっぱり要るとなったら、私の一つ前のコメントのように、画像を保存する前に、RGBからBGRに戻す処理を追加してください
Tetsuya_Kosaka

2021/07/12 23:56

最後までアドバイスありがとうございます。 様々な処理をテストし判断させていただきます。
guest

回答1

0

自己解決

皆様ありがとうございます。
解決しましたので改善したコードを下記に示します。

python

1import numpy as np 2import cv2 3import tensorflow as tf 4 5def main(): 6 i = 0 7 n = 10 8 pro_height = 3000 9 pro_width = 4000 10 hd_height = 2160 11 hd_width = 3480 12 stock_img = [] 13 d = [] 14 y0 = int(pro_height/n) 15 x0 = int(pro_width/n) 16 17 img = cv2.imread('./image/image.png') 18 #img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 19 lr_h, lr_w = img.shape[0], img.shape[1] 20 21 # 画像分割 22 if lr_h < lr_w: 23 r_img = cv2.resize(img, (pro_width, pro_height)) 24 a = [r_img[y0*y:y0*(y+1), x0*x:x0*(x+1)] for y in range(n) for x in range(n)] 25 26 b = tf.convert_to_tensor(a, np.float32) 27 # 正規化 28 c = (b.numpy() - 127.5) / 127.5 29 30 # ================= 31 # ===その他の処理=== 32 # ================= 33 34 # 正規化を解く 35 d = np.clip((c) * 127.5 + 127.5, 0, 255).astype(np.uint8) 36 37 38 # 画像結合 39 for _ in range(n): 40 img = [d[x+i] for x in range(n)] 41 img_x = cv2.hconcat(img) 42 stock_img.append(img_x) 43 i += n 44 45 image = cv2.vconcat(stock_img) 46 image = cv2.resize(image, (hd_width, hd_height)) 47 cv2.imwrite('./result_{0}.png'.format(n), image) 48 49if __name__ == '__main__': 50 main()

ありがとうございました。

投稿2021/07/12 23:55

編集2021/07/12 23:59
Tetsuya_Kosaka

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問