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

回答編集履歴

2

修正

2020/10/29 12:25

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -8,27 +8,34 @@
8
8
  ```python
9
9
  import cv2
10
10
  import numpy as np
11
+ import matplotlib.pyplot as plt
11
12
 
12
- # 画像を読み込む。
13
+ # (coins.png)の読み込
13
14
  img = cv2.imread("sample.png")
14
15
 
16
+
15
- # グレースケールに変換する
17
+ # グレースケールに変換する
16
18
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
17
19
 
18
- # 2値化する。
20
+ # Otuの二値化(入力はgrayのみ)
19
21
  ret, bin_img = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
20
22
 
23
+
21
- # 輪郭抽出する。
24
+ # 輪郭抽出
22
25
  contours, _ = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
26
+ # 小さい輪郭は誤検出として削除
23
27
 
24
- # 輪郭内部を塗りつぶす
28
+ # 輪郭内部を塗りつぶすdrawContours
25
29
  cv2.drawContours(bin_img, contours, -1, color=255, thickness=-1)
26
30
 
27
- dst = np.empty_like(img)
31
+
28
32
  color_fg = (255, 0, 0) # 2値画像で画素値255に割り当てる色
29
33
  color_bg = (0, 255, 0) # 2値画像で画素値0に割り当てる色
30
- dst = np.where(bin_img[..., np.newaxis] == 255, color_fg, color_bg)
34
+ dst = np.where(bin_img[..., np.newaxis] == 255, color_fg, color_bg).astype(np.uint8)
31
- imshow(dst)
35
+ cv2.imshow("dst", dst)
36
+ cv2.waitKey(0)
37
+ cv2.destroyAllWindows()
38
+
32
39
  ```
33
40
 
34
41
  ![イメージ説明](908dda18df7279961697883e747c7b1d.jpeg)

1

d

2020/10/29 12:25

投稿

tiitoi
tiitoi

スコア21960

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