質問編集履歴
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
コードを読みにくい点があったため
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
|
-
|
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値の変更
|