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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/05 05:56
2019/05/05 06:03
2019/05/05 06:26
2019/05/05 06:32
2019/05/05 07:22
2019/05/05 07:25
2019/05/05 07:36