質問編集履歴

2

コメントを受けて一部改善できたところを追記

2023/07/20 20:08

投稿

misox
misox

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,67 @@
1
1
  ### 実現したいこと
2
- 見切れているオブジェクトも含めて画像中のオブジェクトを輪郭検出したい。
2
+ 下記画像で赤線に塗っている部分のオブジェクトを輪郭検出したい。
3
3
 
4
- ※理想は以下の画像で赤色に塗っている部分を検出したいです
5
4
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-07-17/fad1acb5-e6be-4084-9ab7-76e700b11ebd.jpeg)
6
5
  ### 前提
7
6
 
8
7
  画像中の線の数を数えるプログラムを作りたいのですが、見切れているためか検出されない線があります。
9
8
  どういった手法なら以下の画像中に存在する見切れた線も検出することができるでしょうか?
9
+
10
+ ### ※7/21追記
11
+ みなさんのコメントのおかげでモルフォロジー変換でノイズを飛ばすことができました!
12
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-07-21/c826dd10-0b96-48b6-839e-8f73c31e49ab.png)
13
+ モルフォロジー変換でノイズとして消すことのできなかった部分は領域の大きさで除外しようと思っていたのですが
14
+ 下記のコードで領域の大きさを視覚化したところどうも赤線部分のオブジェクトは極端に領域の大きさが小さくとらえられているようです。
15
+ なにかコードに不備があるのでしょうか?
16
+ 上記の画像から太線のみを検出できる方法があれば教えていただきたいです。
17
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-07-21/2a3429de-c364-4421-9727-c40000481081.png)
18
+ ```Python
19
+ from google.colab.patches import cv2_imshow
20
+ import cv2
21
+ import numpy as np
22
+
23
+ # 画像を読み込む
24
+ image = cv2.imread('/content/28896_12765.png')
25
+
26
+ # 画像をグレースケールに変換
27
+ gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
28
+
29
+ # Cannyエッジ検出を適用
30
+ threshold1 = 100
31
+ threshold2 = 650
32
+ edges = cv2.Canny(gray, threshold1, threshold2)
33
+
34
+ # 輪郭を検出
35
+ contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
36
+
37
+ # 面積が一定以上の輪郭のみを抽出
38
+ filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 2]
39
+
40
+ # 線を描画したコピーを作成
41
+ image_lines = image.copy()
42
+ cv2.drawContours(image_lines, filtered_contours, -1, (0, 255, 0), 2)
43
+
44
+ # 各輪郭の面積を描画
45
+ for cnt in filtered_contours:
46
+ # 輪郭の面積を取得
47
+ area = cv2.contourArea(cnt)
48
+
49
+ # 輪郭の中心座標を取得
50
+ M = cv2.moments(cnt)
51
+ cx = int(M["m10"] / M["m00"])
52
+ cy = int(M["m01"] / M["m00"])
53
+
54
+ # テキストを描画
55
+ cv2.putText(image_lines, f"S: {area}", (cx - 50, cy), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 2)
56
+
57
+ # 画像を表示
58
+ cv2_imshow(image_lines)
59
+
60
+ # 検出された輪郭の数を出力
61
+ line_count = len(filtered_contours)
62
+ print("線の数:", line_count)
63
+ ```
64
+
10
65
 
11
66
  ### 発生している問題・エラーメッセージ
12
67
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-07-17/01ed8cbe-4eb6-43c6-9998-15c70afe76a5.png)

1

コードを読みにくい点があったため

2023/07/17 12:36

投稿

misox
misox

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,8 @@
1
1
  ### 実現したいこと
2
2
  見切れているオブジェクトも含めて画像中のオブジェクトを輪郭検出したい。
3
3
 
4
+ ※理想は以下の画像で赤色に塗っている部分を検出したいです
5
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-07-17/fad1acb5-e6be-4084-9ab7-76e700b11ebd.jpeg)
4
6
  ### 前提
5
7
 
6
8
  画像中の線の数を数えるプログラムを作りたいのですが、見切れているためか検出されない線があります。
@@ -12,11 +14,8 @@
12
14
 
13
15
  エラー自体は出ていないのですが、上記の画像のように上手く検出できない線があります。
14
16
  上から1/4ほどのところで画像を横切っている太い線や画像左下部の3つ並んだ線、画像右下から伸びる少し穴の開いた線なども検出できるようにしたいです。
15
- ### 該当のソースコード
16
-
17
- ```ここに言語名を入力
17
+ ```Python
18
- Python(Google Colaboratory上)
19
- ```from google.colab.patches import cv2_imshow
18
+ from google.colab.patches import cv2_imshow
20
19
  import cv2
21
20
  import numpy as np
22
21
 
@@ -49,6 +48,7 @@
49
48
  print("線の数:", line_count)
50
49
  ```
51
50
 
51
+
52
52
  ### 試したこと
53
53
 
54
54
  しきい値やthreshold値の変更