回答編集履歴

3

d

2019/06/04 06:09

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -116,7 +116,7 @@
116
116
 
117
117
  先程作成した2値画像を膨張処理し、膨張後 - 膨張前と差分をとることで、白っぽい色に隣接する画素を取得できる。
118
118
 
119
-
119
+ ]
120
120
 
121
121
  ```python
122
122
 
@@ -130,7 +130,7 @@
130
130
 
131
131
  # 膨張後 - 膨張前 = 白に隣接するピクセル
132
132
 
133
- adjacent = cv2.subtract(dilated, binary)
133
+ adjacent = cv2.subtract(dilated, white)
134
134
 
135
135
  ```
136
136
 
@@ -172,6 +172,10 @@
172
172
 
173
173
 
174
174
 
175
+ 以下がコード全体
176
+
177
+
178
+
175
179
  ![イメージ説明](741aee1cab059d4bc8cbada76e2219ae.png)
176
180
 
177
181
 
@@ -204,7 +208,7 @@
204
208
 
205
209
  # 膨張後 - 膨張前 = 白に隣接するピクセル
206
210
 
207
- adjacent = cv2.subtract(dilated, binary)
211
+ adjacent = cv2.subtract(dilated, white)
208
212
 
209
213
 
210
214
 

2

d

2019/06/04 06:09

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -63,3 +63,173 @@
63
63
 
64
64
 
65
65
  不明な点等あればコメントしてください。
66
+
67
+
68
+
69
+ ## 追記
70
+
71
+
72
+
73
+ > ほんの少し白い部分が残ってしまったものの、
74
+
75
+
76
+
77
+ 厳密に白 (255, 255, 255) でなく、白っぽい色は全部塗りつぶしたいということであれば、inRange() で色の範囲を指定してください。
78
+
79
+
80
+
81
+ > 周辺の色の情報を取得し、それと同じ色で画像の穴あき部分を塗りつぶす、ということができると以前何かのサイトで見かけた気がするのですが、どうしてもうまく検索できません…。
82
+
83
+
84
+
85
+ 少し複雑になりますが、以下の手順でできます。
86
+
87
+
88
+
89
+ ### 1. inRange() で白っぽい色かどうかで2値化する。
90
+
91
+
92
+
93
+ ```python
94
+
95
+ white = cv2.inRange(img, (250, 250, 250), (255, 255, 255))
96
+
97
+ ```
98
+
99
+
100
+
101
+ (250, 250, 250) <= (b, g, r) <= (255, 255, 255) の画素は255、そうでない画素は0の2値画像を作成される。
102
+
103
+
104
+
105
+ 解説: [OpenCV - inRange による範囲指定で2値化する方法について](http://pynote.hatenablog.com/entry/opencv-inrange)
106
+
107
+
108
+
109
+ ![イメージ説明](6adc8e0b7881d5571ee419391519fcff.png)
110
+
111
+
112
+
113
+ ### 2. 白っぽい色に隣接する画素を取得する。
114
+
115
+
116
+
117
+ 先程作成した2値画像を膨張処理し、膨張後 - 膨張前と差分をとることで、白っぽい色に隣接する画素を取得できる。
118
+
119
+
120
+
121
+ ```python
122
+
123
+ # 膨張処理を行う。
124
+
125
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
126
+
127
+ dilated = cv2.dilate(white, kernel)
128
+
129
+
130
+
131
+ # 膨張後 - 膨張前 = 白に隣接するピクセル
132
+
133
+ adjacent = cv2.subtract(dilated, binary)
134
+
135
+ ```
136
+
137
+
138
+
139
+ 解説: [OpenCV - モルフォロジー演算について](http://pynote.hatenablog.com/entry/opencv-morpology)
140
+
141
+
142
+
143
+ ![イメージ説明](6953b3b1cb05491d7947857d680c123a.png)
144
+
145
+
146
+
147
+ ### 3. 隣接する画素から適当に1つ色を取得し、その色で白っぽい色の画素を塗りつぶす。
148
+
149
+
150
+
151
+ ```python
152
+
153
+ # 白に隣接するピクセルの色を取得する。
154
+
155
+ adjacent_colors = img[np.where(adjacent == 255)]
156
+
157
+ fill_color = adjacent_colors[0] # 隣接するピクセルは沢山あるので、適当に1つピックアップ
158
+
159
+ print(fill_color)
160
+
161
+
162
+
163
+ # その色で塗りつぶす。
164
+
165
+ img[white == 255] = fill_color # 白のピクセルを塗りつぶす。
166
+
167
+ ```
168
+
169
+
170
+
171
+ ### サンプルコード
172
+
173
+
174
+
175
+ ![イメージ説明](741aee1cab059d4bc8cbada76e2219ae.png)
176
+
177
+
178
+
179
+ ```python
180
+
181
+ import cv2
182
+
183
+
184
+
185
+ # 画像を読み込む。
186
+
187
+ img = cv2.imread('test.png')
188
+
189
+
190
+
191
+ # 白かどうかで2値化する。
192
+
193
+ white = cv2.inRange(img, (250, 250, 250), (255, 255, 255))
194
+
195
+
196
+
197
+ # 膨張処理を行う。
198
+
199
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
200
+
201
+ dilated = cv2.dilate(white, kernel)
202
+
203
+
204
+
205
+ # 膨張後 - 膨張前 = 白に隣接するピクセル
206
+
207
+ adjacent = cv2.subtract(dilated, binary)
208
+
209
+
210
+
211
+ # 白に隣接するピクセルの色を取得する。
212
+
213
+ adjacent_colors = img[np.where(adjacent == 255)]
214
+
215
+ fill_color = adjacent_colors[0] # 隣接するピクセルは沢山あるので、適当に1つピックアップ
216
+
217
+ print(fill_color)
218
+
219
+
220
+
221
+ # その色で塗りつぶす。
222
+
223
+ img[white == 255] = fill_color # 白のピクセルを塗りつぶす。
224
+
225
+
226
+
227
+ # 画像を書き込む。
228
+
229
+ cv2.imwrite('result.png', img)
230
+
231
+ ```
232
+
233
+
234
+
235
+ ![イメージ説明](b767189b81774c25cb288a85f689e0cf.png)

1

d

2019/06/04 05:31

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  bitwise_and に渡した第1引数と第2引数がおかしいというエラーです。
6
6
 
7
- `cv2.bitwise_and(img, mask_white)` において、`img.shape, mask_white.shape` の型及び形状は一致していますか?
7
+ `cv2.bitwise_and(img, mask_white)` において、`img, mask_white` の型及び形状は一致していますか?
8
8
 
9
9
 
10
10
 
@@ -55,3 +55,11 @@
55
55
 
56
56
 
57
57
  ![イメージ説明](f2c15d1a6383e91c43620fce00441fa5.png)
58
+
59
+
60
+
61
+ ----
62
+
63
+
64
+
65
+ 不明な点等あればコメントしてください。