回答編集履歴
3
d
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,
|
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
|

|
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,
|
106
|
+
adjacent = cv2.subtract(dilated, white)
|
105
107
|
|
106
108
|
# 白に隣接するピクセルの色を取得する。
|
107
109
|
adjacent_colors = img[np.where(adjacent == 255)]
|
2
d
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
|
+

|
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
|
+

|
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
|
+

|
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
|
+

|
1
d
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
|
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
|
-

|
29
|
+

|
30
|
+
|
31
|
+
----
|
32
|
+
|
33
|
+
不明な点等あればコメントしてください。
|