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

回答編集履歴

3

d

2019/06/04 06:09

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -57,14 +57,14 @@
57
57
  ### 2. 白っぽい色に隣接する画素を取得する。
58
58
 
59
59
  先程作成した2値画像を膨張処理し、膨張後 - 膨張前と差分をとることで、白っぽい色に隣接する画素を取得できる。
60
-
60
+ ]
61
61
  ```python
62
62
  # 膨張処理を行う。
63
63
  kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
64
64
  dilated = cv2.dilate(white, kernel)
65
65
 
66
66
  # 膨張後 - 膨張前 = 白に隣接するピクセル
67
- adjacent = cv2.subtract(dilated, binary)
67
+ adjacent = cv2.subtract(dilated, white)
68
68
  ```
69
69
 
70
70
  解説: [OpenCV - モルフォロジー演算について](http://pynote.hatenablog.com/entry/opencv-morpology)
@@ -85,6 +85,8 @@
85
85
 
86
86
  ### サンプルコード
87
87
 
88
+ 以下がコード全体
89
+
88
90
  ![イメージ説明](741aee1cab059d4bc8cbada76e2219ae.png)
89
91
 
90
92
  ```python
@@ -101,7 +103,7 @@
101
103
  dilated = cv2.dilate(white, kernel)
102
104
 
103
105
  # 膨張後 - 膨張前 = 白に隣接するピクセル
104
- adjacent = cv2.subtract(dilated, binary)
106
+ adjacent = cv2.subtract(dilated, white)
105
107
 
106
108
  # 白に隣接するピクセルの色を取得する。
107
109
  adjacent_colors = img[np.where(adjacent == 255)]

2

d

2019/06/04 06:09

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -30,4 +30,89 @@
30
30
 
31
31
  ----
32
32
 
33
- 不明な点等あればコメントしてください。
33
+ 不明な点等あればコメントしてください。
34
+
35
+ ## 追記
36
+
37
+ > ほんの少し白い部分が残ってしまったものの、
38
+
39
+ 厳密に白 (255, 255, 255) でなく、白っぽい色は全部塗りつぶしたいということであれば、inRange() で色の範囲を指定してください。
40
+
41
+ > 周辺の色の情報を取得し、それと同じ色で画像の穴あき部分を塗りつぶす、ということができると以前何かのサイトで見かけた気がするのですが、どうしてもうまく検索できません…。
42
+
43
+ 少し複雑になりますが、以下の手順でできます。
44
+
45
+ ### 1. inRange() で白っぽい色かどうかで2値化する。
46
+
47
+ ```python
48
+ white = cv2.inRange(img, (250, 250, 250), (255, 255, 255))
49
+ ```
50
+
51
+ (250, 250, 250) <= (b, g, r) <= (255, 255, 255) の画素は255、そうでない画素は0の2値画像を作成される。
52
+
53
+ 解説: [OpenCV - inRange による範囲指定で2値化する方法について](http://pynote.hatenablog.com/entry/opencv-inrange)
54
+
55
+ ![イメージ説明](6adc8e0b7881d5571ee419391519fcff.png)
56
+
57
+ ### 2. 白っぽい色に隣接する画素を取得する。
58
+
59
+ 先程作成した2値画像を膨張処理し、膨張後 - 膨張前と差分をとることで、白っぽい色に隣接する画素を取得できる。
60
+
61
+ ```python
62
+ # 膨張処理を行う。
63
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
64
+ dilated = cv2.dilate(white, kernel)
65
+
66
+ # 膨張後 - 膨張前 = 白に隣接するピクセル
67
+ adjacent = cv2.subtract(dilated, binary)
68
+ ```
69
+
70
+ 解説: [OpenCV - モルフォロジー演算について](http://pynote.hatenablog.com/entry/opencv-morpology)
71
+
72
+ ![イメージ説明](6953b3b1cb05491d7947857d680c123a.png)
73
+
74
+ ### 3. 隣接する画素から適当に1つ色を取得し、その色で白っぽい色の画素を塗りつぶす。
75
+
76
+ ```python
77
+ # 白に隣接するピクセルの色を取得する。
78
+ adjacent_colors = img[np.where(adjacent == 255)]
79
+ fill_color = adjacent_colors[0] # 隣接するピクセルは沢山あるので、適当に1つピックアップ
80
+ print(fill_color)
81
+
82
+ # その色で塗りつぶす。
83
+ img[white == 255] = fill_color # 白のピクセルを塗りつぶす。
84
+ ```
85
+
86
+ ### サンプルコード
87
+
88
+ ![イメージ説明](741aee1cab059d4bc8cbada76e2219ae.png)
89
+
90
+ ```python
91
+ import cv2
92
+
93
+ # 画像を読み込む。
94
+ img = cv2.imread('test.png')
95
+
96
+ # 白かどうかで2値化する。
97
+ white = cv2.inRange(img, (250, 250, 250), (255, 255, 255))
98
+
99
+ # 膨張処理を行う。
100
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
101
+ dilated = cv2.dilate(white, kernel)
102
+
103
+ # 膨張後 - 膨張前 = 白に隣接するピクセル
104
+ adjacent = cv2.subtract(dilated, binary)
105
+
106
+ # 白に隣接するピクセルの色を取得する。
107
+ adjacent_colors = img[np.where(adjacent == 255)]
108
+ fill_color = adjacent_colors[0] # 隣接するピクセルは沢山あるので、適当に1つピックアップ
109
+ print(fill_color)
110
+
111
+ # その色で塗りつぶす。
112
+ img[white == 255] = fill_color # 白のピクセルを塗りつぶす。
113
+
114
+ # 画像を書き込む。
115
+ cv2.imwrite('result.png', img)
116
+ ```
117
+
118
+ ![イメージ説明](b767189b81774c25cb288a85f689e0cf.png)

1

d

2019/06/04 05:31

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  > The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function 'binary_op'
2
2
 
3
3
  bitwise_and に渡した第1引数と第2引数がおかしいというエラーです。
4
- `cv2.bitwise_and(img, mask_white)` において、`img.shape, mask_white.shape` の型及び形状は一致していますか?
4
+ `cv2.bitwise_and(img, mask_white)` において、`img, mask_white` の型及び形状は一致していますか?
5
5
 
6
6
  ```python
7
7
  # これが成り立つことが前提
@@ -26,4 +26,8 @@
26
26
  cv2.imwrite("output.png", img)
27
27
  ```
28
28
 
29
- ![イメージ説明](f2c15d1a6383e91c43620fce00441fa5.png)
29
+ ![イメージ説明](f2c15d1a6383e91c43620fce00441fa5.png)
30
+
31
+ ----
32
+
33
+ 不明な点等あればコメントしてください。