teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

PILでGだけ抜き取る方法を追加

2021/02/23 00:21

投稿

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

1

補足

2021/02/23 00:21

投稿

退会済みユーザー
answer CHANGED
@@ -5,4 +5,6 @@
5
5
  img = cv2.imread(path)
6
6
  img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
7
7
  ```
8
- これでカラー画像をグレースケールにできます。
8
+ これでカラー画像をグレースケールにできます。
9
+
10
+ グレースケールよりももっと値を圧縮したいのであれば、[`cv2.threshold()`](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html)を試してください。