以下追加投稿分 PILを使って3chから1chだけ抜き取る(グレースケール変換しない)
<--サンプル画像
要点は、
- PILのデータのままでは扱いにくいので
Numpy形式
に書き戻す
- Numpy形式のデータにおいてPILデータは
[h, w, ch]
の順番
ch
はRGB
の順番なので、インデックス番号1
でG
のデータは抜き出せる
Python3
1import numpy as np
2from PIL import Image
3
4path = "./sample.png"
5
6# PILで開いたうえでデータをNumpy形式にする
7# (例えばJPEGは圧縮されていてNumpyな配列になっていないので、
8# そこからNumpyのデータ空間(?)に持ってくる必要がある)
9img = np.asarray(Image.open(path))
10
11# 元画像のshape (PILではchはRGB)
12# print(img.shape)
13
14# カラー画像の時Gだけ抜き取りたい
15if len(img.shape) ==3:
16 h, w, ch = img.shape
17
18 # RGBのGだけ抜き取りたい
19 img_g = img[:,:,1]
20
21 # Numpy配列
22 print(img_g)
23 # [[ 28 28 255 255 0 0]
24 # [ 28 28 255 255 0 0]
25 # [ 0 0 127 127 255 255]
26 # [ 0 0 127 127 255 255]]
27
28
29 # ################################
30 # print("以下デバグ")
31 # list_ch = ["R", "G", "B"]
32 #
33 # #デバグ用 RGBを走査
34 # for i in range(ch):
35 # img_single_ch = img[:,:,i]
36 #
37 # print(list_ch[i],img_single_ch.shape)
38 # # OS標準のビューワーで開く
39 # Image.fromarray(img_single_ch.astype(np.uint8)).resize(size=(w*10,h*10),resample=Image.NEAREST).show()
40
以下初回投稿分 OpenCVを使って3ch-->1ch変換
画像関連であればPILかOpenCVかのどちらかが使いやすいと思います。
OpenCVは色の変換が楽だと思いますのでOpenCVをお勧めします。
Python3
1import cv2.
2img = cv2.imread(path)
3img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
これでカラー画像をグレースケールにできます。
グレースケールよりももっと値を圧縮したいのであれば、cv2.threshold()
を試してください。