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

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

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

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python

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

Q&A

1回答

3763閲覧

インデックスカラーのrgb値を整数に変換したい

rk2

総合スコア11

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python

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

0グッド

1クリップ

投稿2019/05/05 04:49

編集2019/05/08 01:59

PythonとPILを使用して画像処理を行っています.
インデクスカラーで読みこんだ画像のパレットを編集し保存するということを行っていました.
上記の部分は出来るようになったのですが,保存の際にrgb値を整数(できれば0~255)で保存したいと考えています.
matlabのイメージビューア―で確認したところ,現在のrgb値は0.0~1.0の範囲の小数値になってしまっています.
インデックス値が適切な値になっているので単純に画像ファイルとしては問題ないのですが,今回は作成したインデックスカラーの画像を正解画像としてセグメンテーションをchainerで行いたいと考えています.
chainerでは正解画像データを整数として入力する必要があるようなので,今回このような質問をさせていただきました.

自分では以下の方法などを試してみました.
① 一度rgb画像にモード変換をし,直接rgb値を編集,その後インデクスカラーモードの再変換する
この方法はモード変換した際にそれまで行った,パレットの編集などが消えてしまい,使えませんでした.

② 一度numpy配列に変換し,直接rgb値を編集,その後インデクスカラーモードの再変換する
この方法は保存した画像が白黒の二値画像(元の画像は赤,緑,黒の単純三色画像)になってしまいました.

パレットの編集などに使用したコードは以下に記載します.
分かる方いらっしゃいましたらご教授願います.
宜しくお願い致します.

python

1import numpy as np 2import cv2 3from PIL import Image 4import matplotlib.pyplot as plt 5 6for number in range(1, 2): 7# 8 label_filenames = ( 9 #r"C:\Users\ttbnb\Desktop\data\label572\label{0}.png".format(number)) 10 r"C:\Users\ttbnb\Desktop\zu2.png") 11 12 #PILで読み込み 13 img = Image.open(label_filenames) 14 15 #インデックスカラーに変換 16 img = img.convert("P") 17 18 #カラーパレットにアクセスする。 19 palette = img.getpalette() 20 #リストの値は index=0 から順番に [R, G, B, R, G, B, ...]なので,扱いやすいように二次元配列に変形 21 palette = np.array(palette).reshape(-1, 3) 22 23 #パレット番号を取得する 24 black_index_list = [] 25 red_index_list = [] 26 green_index_list = [] 27 index_list = [] 28 29 data_for_index = list(map(int, img.getdata())) 30 for i, v in enumerate(data_for_index): 31 index_list.append(data_for_index[i]) 32 #重複した値を削除する 33 index_list = list(set(index_list)) 34 35 for palette_number in range(256): 36 #黒のパレット番号を取得する 複数ある場合も考慮する 37 if (palette[palette_number] == [0, 0, 0]).all(): 38 black_index_list.append(palette_number) 39 40 #赤のパレット番号を取得する 複数ある場合も考慮する 41 elif (palette[palette_number] == [255, 0, 0]).all(): 42 red_index_list.append(palette_number) 43 44 #緑のパレット番号を取得する 複数ある場合も考慮する 45 elif (palette[palette_number] == [0, 255, 0]).all(): 46 green_index_list.append(palette_number) 47 48 #index_listと重複するものをそれぞれのインデックスカラーに設定する 49 black_index_list = list(set(index_list) & set(black_index_list)) 50 black_index = black_index_list[0] 51 red_index_list = list(set(index_list) & set(red_index_list)) 52 red_index = red_index_list[0] 53 green_index_list = list(set(index_list) & set(green_index_list)) 54 green_index = green_index_list[0] 55 56 #カラーパレットの入れ替え 57 #1番目のパレット[0]に[0, 0, 0] クラス:無し を設定 58 tmp = palette[0] 59 palette[0] = palette[black_index] 60 palette[black_index] = tmp 61 62 #2番目のパレット[1]に[255, 0, 0] クラス:糸 を設定 63 tmp = palette[1] 64 palette[1] = palette[red_index] 65 palette[red_index] = tmp 66 67 #3番目のパレット[2]に[0, 255, 0] クラス:鉗子を設定 68 tmp = palette[2] 69 palette[2] = palette[green_index] 70 palette[green_index] = tmp 71 72 #パレット数の変更 73 N_COLOR = 3 74 palette = palette[:N_COLOR] 75 76 #変更したパレットをリスト形式に変形し直し,再設定する 77 palette = palette.reshape(-1).tolist() 78 img.putpalette(palette) 79 80 #実データの更新 81 data = list(map(int, img.getdata())) 82 83 for i, v in enumerate(data): 84 if data[i] == red_index: 85 data[i] = 1 86 elif data[i] == green_index: 87 data[i] = 2 88 else: 89 data[i] = 0 90 91 #更新した実データを再設定 92 img.putdata(data) 93  #更新したパレット情報などを保持したままrgb値を整数に変換し保存したい 94 95 img.save(r"ret.png") 96

使用した画像は以下の画像になります.イメージ説明

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

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

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

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

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

guest

回答1

0

現在はrgb値は0.0~1.0の範囲の小数値になってしまっています.

これはどのような手段で確認されましたか?
提示コードにてret.pngを生成し、その内容を下記コードで確認してみましたが、実データ(ピクセル値)は0,1,2の整数値になっているようでした。

Python

1import numpy as np 2import cv2 3from PIL import Image 4 5# 変換後の画像をPILで読み込み 6img = Image.open('ret.png') 7 8#インデックスカラーに変換 9img = img.convert("P") 10 11#カラーパレットにアクセスする。 12palette = img.getpalette() 13#リストの値は index=0 から順番に [R, G, B, R, G, B, ...]なので,扱いやすいように二次元配列に変形 14palette = np.array(palette).reshape(-1, 3) 15print(palette) 16""" 17[[ 0 0 0] 18 [255 0 0] 19 [ 0 255 0] 20 [ 3 3 3] 2122""" 23 24# 実データ(ピクセル値)の確認 25data = img.getdata() 26data = list(map(int, data)) 27print(data) 28""" 29[0, 0, 0, 0, 0, 0, 0, 0, 0,30 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,31 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,32 :

投稿2019/05/05 05:43

can110

総合スコア38262

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

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

rk2

2019/05/05 05:56

matlabのイメージビューアーで確認しました.インデックスカラーで保存しているので直接データの値を参照するとインデックスが取得でき整数値が確認できるのだと思います. 実際のrgb値では小数になっていました. matlabのイメージビューア―では,ピクセル情報(x座標,y座標) <インデックス番号> (r,g,b)が表示されていました.
can110

2019/05/05 06:03

ピクセル値はちゃんと各パレットのインデックス値を持っているのでファイルデータとしては問題ないと考えます。 あとはmatlabでなぜ小数表示されるか?ですが、当方matlab触ったことないので分かりません。。
rk2

2019/05/05 06:26

確かに画像だけ見れば問題ないのですが,今回は作成したインデックスカラー画像を正解画像としたセグメンテーションをchainerにて行いたいと考えています.正解画像の方が整数である必要があるので今回このような質問をさせてもらっています.
can110

2019/05/05 06:32

chainerでの処理は不勉強のため、これ以上のアドバイスはできないと思います。すみません。
rk2

2019/05/05 07:22

分かりました. 他の回答者様の回答を待ちたいと思います.
can110

2019/05/05 07:25

了解しました。 なお、このコメント欄で補足された内容は、質問本文にも転記しておくとよいかと思います。
rk2

2019/05/05 07:36

アドバイス有難うございます. 質問編集致しました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問