回答編集履歴

2

修正

2020/10/29 12:25

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -18,47 +18,61 @@
18
18
 
19
19
  import numpy as np
20
20
 
21
+ import matplotlib.pyplot as plt
21
22
 
22
23
 
24
+
23
- # 画像を読み込む。
25
+ # (coins.png)の読み込
24
26
 
25
27
  img = cv2.imread("sample.png")
26
28
 
27
29
 
28
30
 
31
+
32
+
29
- # グレースケールに変換する
33
+ # グレースケールに変換する
30
34
 
31
35
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
32
36
 
33
37
 
34
38
 
35
- # 2値化する。
39
+ # Otuの二値化(入力はgrayのみ)
36
40
 
37
41
  ret, bin_img = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
38
42
 
39
43
 
40
44
 
45
+
46
+
41
- # 輪郭抽出する。
47
+ # 輪郭抽出
42
48
 
43
49
  contours, _ = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
44
50
 
51
+ # 小さい輪郭は誤検出として削除
45
52
 
46
53
 
54
+
47
- # 輪郭内部を塗りつぶす
55
+ # 輪郭内部を塗りつぶすdrawContours
48
56
 
49
57
  cv2.drawContours(bin_img, contours, -1, color=255, thickness=-1)
50
58
 
51
59
 
52
60
 
53
- dst = np.empty_like(img)
61
+
54
62
 
55
63
  color_fg = (255, 0, 0) # 2値画像で画素値255に割り当てる色
56
64
 
57
65
  color_bg = (0, 255, 0) # 2値画像で画素値0に割り当てる色
58
66
 
59
- dst = np.where(bin_img[..., np.newaxis] == 255, color_fg, color_bg)
67
+ dst = np.where(bin_img[..., np.newaxis] == 255, color_fg, color_bg).astype(np.uint8)
60
68
 
61
- imshow(dst)
69
+ cv2.imshow("dst", dst)
70
+
71
+ cv2.waitKey(0)
72
+
73
+ cv2.destroyAllWindows()
74
+
75
+
62
76
 
63
77
  ```
64
78
 

1

d

2020/10/29 12:25

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -7,6 +7,8 @@
7
7
 
8
8
 
9
9
  でできると思います。
10
+
11
+ `[..., np.newaxis]` は2値画像の形状は (H, W) なのに対し、カラー画像の形状は (H, W, C) なので、2値画像の形状を (H, W, 1) とすることで numpy のブロードキャストが効くようにする意図です。
10
12
 
11
13
 
12
14