pythonの質問なんですが
pythonの質問なんですが 2値化したそれぞれ別の画像が10枚あります。その10枚は640×400ピクセルです。2値化してるので、それぞれのピクセルは、0または255になっています。それぞれのピクセルを255で割ると、0または1になると思います。それを10枚分作ります。すると、例えば、一番左上の角のピクセルは、10枚分の0か1の数字が出てくると思います。それを並べてビット列として10桁の2進数にします。それを10進数に変換して、その値を640×400個分当てはめた画像を作りたいです。 現時点で、画像の通り、255で割る段階まではできてます。続きをどうすればいいか教えていただきたいです。 何卒よろしくお願いします。
ベストアンサー
imread時に不必要にカラー画像(640×400×3)で読み込まれてしまっているので、cv2.imread('white.png', 0)のように0で(640×400)で読み込んでください。 ims = np.stack(images).astype(int) new_ims = np.apply_along_axis(lambda x:int(''.join([str(i) for i in x]), 2), 0, ims) これでnew_imsは640x400の2進数→10進数変換をかけた配列になるので、imwrite等で書き出してください 10bitだと最大値512で255オーバーする気がしますが、質問に指示がなかったので無視してそのまま値入れてます なお、2進数とみなすときに、imagesの並び順に上位ビットになります。 (images = [img1, img2, ...]としたら、img1の0/1が最上位ビットになる) 一応解説 ・np.stack(images).astype(int) ・・640x400の画像を新しい軸で重ねている。このときimreadでRGBの3次元あると邪魔なので0をつけて2次元だけにしている ・・250で割ったときにfloatになっている可能性があるので、一応intに直す ・np.apply_along_axis(lambda x:int(''.join([str(i) for i in x]), 2), 0, ims) ・・np.apply_along_axisは特定の軸に対して関数を適用する(それを全要素に) ・・第一引数のlambdaは無名関数。xは重ねた10枚の同座標の値(配列) ・・[str(i) for i in x]で文字列化したリストに直す(intを適用して2進数にするため) ・・''.join([str(i) for i in x]), 2)で文字列かしたリストを結合10010...の形に ・・int(string, 2)は文字列を2進数だとみなして10進数のintに直す ・・第二引数の0は軸0(10枚を重ねた方向)に対して抜き出すという指示 ・・第三引数はnp.apply_along_axisを適用する配列、640x400x10のもの
ありがとうございます! 丁寧でとてもわかりやすいです! それぞれのピクセルの値を色として、1枚の画像を出力する場合、どうすればいいでしょうか?
質問者からのお礼コメント
お世話になりました!
お礼日時:1/19 23:53