web-dev-qa-db-ja.com

opencv C ++による画像(カラー?)セグメンテーション

http://i.imgur.com/iIv4gJa.png

グラフが示すように、画像を入力して、その結果、いくつかのセグメントを取得したいと思います。

一番近いカラーセグメントをクラスター化するようなものなので、「平均シフト」の概念に近いと思いますか?

ここで関連する質問を検索しましたが、opencv C++で構造を開始および構築する方法がまだわかりません。私はいくつかのアドバイスを探しています、そして私が参照するための実装コードの一部を手に入れてくれればとてもありがたいです!助けてくれてありがとう!

==================================================

2015年5月19日編集

私が試している実装の1つがWatershedであることをここに追加しましょう:( http://blog.csdn.net/fdl19881/article/details/6749976 )。

enter image description here

それは完璧ではありませんが、私が望む結果です。この実装では、ユーザーは手動で操作する(分水界線を引く)必要があるため、自動バージョンを探しています。少し難しいように聞こえますが...それを行うための提案やコードの一部をいただければ幸いです。

7
Oasis

Opencvドキュメント: リンク

パラメータ: ここ

Meanshiftフィルタリングのサンプルコード:

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;
using namespace std;

Mat img, res, element;

int main(int argc, char** argv)
{

   namedWindow( "Meanshift", 0 );
   img = imread( argv[1] );
// GaussianBlur(img, img, Size(5,5), 2, 2);
   pyrMeanShiftFiltering( img, res, 20, 45, 3);
   imwrite("meanshift.png", res);
   imshow( "Meanshift", res );

   waitKey();

   return 0;
}

これは画像の出力です。前に前処理を使用するか、より適切なパラメータを見つける必要がある場合があります。

output

編集:事前にガウスぼかしで出力(コードでコメント)

here

2
Aristu

既存のセグメンテーションアプローチを検討する際の問題は、それらがMatlab(Uni以外の誰も使用できない)に実装されているか、自動ではないことです。色を分割する方法を示す関心のあるオブジェクトまたはレベルを選択することによってユーザーが画像を前処理する必要があるアプローチは、自動ではないため役に立ちません。必要に応じて、この ブログ投稿 で説明されているセグメンテーションのOpenCVベースの実装を試すことができます。完璧ではありませんが、自動でほとんどの作業を実行し、実際にソースをダウンロードして試してみることができます。

1
MoDJ