2017-09-28 17 views
0

フロアプランをクリアして壁を検出したいと思います。私はこの解決策を見つけましたが、コードを理解するのはかなり難しいです。私はOpenCVのと同じことを行うことができますどのように 特別このライン(それがどのように部屋内のテキストおよびその他のオブジェクトを削除しますか?)OpenCVで部屋の境界を検出する方法

DeleteSmallComponents[Binarize[img, {0, .2}]]; 

https://mathematica.stackexchange.com/questions/19546/image-processing-floor-plan-detecting-rooms-borders-area-and-room-names-t

img = Import["http://i.stack.imgur.com/qDhl7.jpg"] 
nsc = DeleteSmallComponents[Binarize[img, {0, .2}]]; 
m = MorphologicalTransform[nsc, {"Min", "Max"}] 

+2

「コードなし」とはどういう意味ですか?その質問に対する答えにはたくさんのコードがあります。あなたはOpenCVで同じことをどうやってすることができますか?無数の書籍やチュートリアルを利用して画像処理やOpenCVの使い方を学ぶことができます。ある日、ソリューションを実装するのに十分な知識があります。 – Piglet

+0

私の悪い、私はそれを修正します。私は主にこの行を理解していません DeleteSmallComponents [バイナリ化[img、{0、.2}]] – jonarya

+0

何が分かりませんか?この行はimgを二進化して小さな成分を削除します。 – Piglet

答えて

2

opencvでは、画像を処理する方法が少し異なります。いくつかの計算を行うには、より低レベルの方法で考える必要があります。低レベルでは、私は基本的な画像処理操作を考えています。例えば

、あなたが示した行:

DeleteSmallComponents[Binarize[img, {0, .2}]]; 

は、アルゴリズムによってOpenCVの中で表現することでした:

  1. 2値化画像
  2. 形態学的に近いか、シンプル/オープン拡張/浸食(に基づきますオブジェクトと背景の色は何ですか):

    cv::threshold(img, img, 100, 255, CV_THRESH_BINARY); 
    cv::dilate(img, img, cv::Mat()); 
    cv::dilate(img, img, cv::Mat()); 
    

enter image description here

さらに独自の距離変換を実装する、または角を検出するために、例えば(という基本は、OpenCVの中に実装されている)ヒットとミス・ルーチンを使用することができます。

cv::Mat kernel = (cv::Mat_<int>(7, 7) << 
    0, 1, 0,0,0,0,0, 
    -1, 1, 0,0,0,0,0, 
    -1, 1, 0,0,0,0,0, 
    -1,1,0,0,0,0,0, 
    -1,1,0,0,0,0,0, 
    -1,1,1,1,1,1,1, 
    -1,-1,-1,-1,-1,-1,0); 
cv::Mat left_down,left_up,right_down,right_up; 
cv::morphologyEx(img, left_down, cv::MORPH_HITMISS, kernel); 
cv::flip(kernel, kernel, 1); 
cv::morphologyEx(img, right_down, cv::MORPH_HITMISS, kernel); 
cv::flip(kernel, kernel, 0); 
cv::morphologyEx(img, right_up, cv::MORPH_HITMISS, kernel); 
cv::flip(kernel, kernel, 1); 
cv::morphologyEx(img, left_up, cv::MORPH_HITMISS, kernel); 

大きなドット(単一の拡張後)と

left_down corners もう一つの絵:

、その後、あなたは次のように絵を持っています

enter image description here 最後に、見つけたコーナーの座標を処理して部屋を決定することができます。

EDIT:ような「二重壁ライン」とのイメージのため: 我々は最初の二重壁のラインを「マージ」する必要があり、そのコードは次のように表示されますenter image description here

cv::threshold(img, img, 220, 255, CV_THRESH_BINARY); 
cv::dilate(img, img, cv::Mat()); //small object textures 
cv::erode(img, img, cv::getStructuringElement(CV_SHAPE_RECT, cv::Size(5, 5)),cv::Point(-1,-1),2); 
cv::dilate(img, img, cv::getStructuringElement(CV_SHAPE_RECT, cv::Size(5, 5)), cv::Point(-1, -1), 3); 

をし、その結果画像は:

enter image description here

悲しいことに、画像のプロパティを変更する場合は、slightlする必要がありますアルゴリズムパラメータを変更する。一般的な解決法を提供する可能性はありますが、問題の可能な変形の大部分を決定しなければならず、より複雑になります。

+0

がその画像に対して適切に動作しています。残念ながらGoogle検索(またはそれに類似した)のこのランダムなフロアプランでは動作しませんhttp://cdn.freshome.com/wp-content/uploads/2010/09/floor-plan_s.jpg、何か考えていますか? – jonarya

+0

ドキュメンテーションと関数名DeleteSmallComponentsは、実際にコンポーネント分析を行い、小領域のブロブを削除することを示します。あなたの形態学的なアプローチはちょうど薄いものを削除します。あなたはまた、あなたの例で開く/閉じるが、拡張だけを提案した。私はそれが混乱していることを知る。 – Piglet

+1

@jonaryaここではすべての画像に対応する解決法はありません。そのため、画像処理を知ることが重要です。あなたの問題に効率よくアルゴリズムを理解し、変更し、適用することができます。あなた自身に好意を持ち、いくつかの本を読んでください。 – Piglet

関連する問題