質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

5381閲覧

python葉脈のハフ変換による筋の抽出

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/24 05:12

編集2019/10/24 05:27

イメージ説明

pythonを用いて葉脈の筋を抽出するというのがうまくいきません.
ハフ変換を用いて葉脈だけを抽出するにはどうしたらよいのでしょうか.
該当コードです.

コード import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('youmyaku04.nitika.png') dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21) plt.subplot(121),plt.imshow(img) plt.subplot(122),plt.imshow(dst) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray,1,1,apertureSize = 5) lines = cv2.HoughLines(edges,1,np.pi/520,95) print(len(lines)) for line in lines: for rho,theta in line: a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 50*(-b)) y1 = int(y0 + 90*(a)) x2 = int(x0 - 50*(-b)) y2 = int(y0 - 90*(a)) cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2) cv2.imwrite('houghlines2.jpg',img)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/10/24 05:19

画像を添付できますか?
退会済みユーザー

退会済みユーザー

2019/10/24 05:22

すみません.画像添付しました.数値を少しずつ変えている最中のものです.
tiitoi

2019/10/24 05:24 編集

すいません。画像というのは画像処理する前の元画像 youmyaku04.nitika.png のことです。
退会済みユーザー

退会済みユーザー

2019/10/24 05:27

すみません.添付しました.
guest

回答3

0

(ハフ変換による曲線検出は実施経験がないので)どの程度可能なのかどうかわかりませんが,検出対象たる

葉脈の筋

の形をある程度の自由度のパラメータを持つ曲線だと仮定すれば,「ハフ変換」も可能なのではないでしょうか.
「ハフ変換 曲線」とか「一般化ハフ変換」で調べると何かヒントが見つかるかも?

投稿2019/10/24 08:24

fana

総合スコア11634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/24 08:28

なるほど。調べてみます!ありがとうございます
guest

0

(別の話になるので回答を分けます)

画像を複数の部分領域に分割し,各領域ごとに(Classicalな直線検出の)ハフ変換を行い,
それらの結果を統合する,という方向性も有り得るかと思います.

領域境界で線を繋いでいって葉脈のカーブを折れ線近似するようなイメージ.
(tiitoi氏の回答内容のような前処理を行った後の状態から開始すれば,そこそこ行けそうな気がします)

投稿2019/10/24 09:25

編集2019/10/24 09:27
fana

総合スコア11634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/29 04:21

ご回答ありがとうございます.Classicalな直線検出のハフ変換を行う,とあるのですが,その簡単な意味を教えていただきたいです.また,pythonで実行可能でしょうか?
fana

2019/10/29 04:49

要するに cv2.HoughLines のことです. この直線検出手段を,画像全体に対して用いるのでなくて,場所毎にやれば良いんじゃないか,という. 「太い葉脈の一部分とそれ以外」を含む小領域毎に直線を1本検出した場合にそれが太い葉脈に相当することが期待できるなら,そういう方法で太い葉脈の断片を線分で近似できるだろうから,それらを繋いで折れ線にできないかな,と.
fana

2019/10/29 04:55

とりあえず画像から,検出したい葉脈の一部を含む部分画像を切り出して,それを今のコードに入力したら葉脈に相当する直線が検出できないか? みたいなのを試してみてはどうでしょうか.
退会済みユーザー

退会済みユーザー

2019/10/29 04:57

なるほど,試してみます.ありがとうございます.
fana

2019/10/29 06:15

画像に対する前提知識(葉脈の角度がどのくらいの範囲だとか)を使って良いなら,投票空間や投票に用いるエッジ点を制限すると良いかも.
guest

0

ベストアンサー

葉脈の筋は直線ではないため、ハフ変換による抽出というのは難しいのではないでしょうか。

以下の方法で太い部分だけ残した2値画像を作成してみましたが、このような意図であっていますか。

  1. モルフォロジー変換で葉脈を強調する。
  2. 連結成分のラベリングを行う。
  3. 面積が一定以上の連結成分のみ残す。

OpenCV - モルフォロジー演算について
OpenCV - connectedComponents() で連結成分のラベリング

サンプルコード

python

1import cv2 2import numpy as np 3 4# 画像をグレースケール形式で読み込む。 5img = cv2.imread("sample.png", cv2.IMREAD_GRAYSCALE) 6 7# CLOSING 処理で線を強調する。 8kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2)) 9morph = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) 10 11# 連結成分のラベリングを行う。 12retval, labels, stats, centroids = cv2.connectedComponentsWithStats( 13 morph, connectivity=8 14) 15 16# 面積が一定以上の連結成分のみ残す。 17dst = np.zeros_like(img) 18for i, s in enumerate(stats, 1): # label=0 は背景なのでスキップ 19 if s[cv2.CC_STAT_AREA] > 100: # ラベル i の面積が一定以上の場合 20 dst[labels == i] = 255 21 22cv2.imwrite("dst.png", dst)

イメージ説明

投稿2019/10/24 06:23

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/24 06:38

ありがとうございます.やはりハフ変換での抽出は難しいのですね. こちらの処理によって太い部分の座標値などはわかったりしますか?
tiitoi

2019/10/24 06:40

元の画像から太い部分以外を除去する形なので、位置はかわりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問