11

リンクの最初の画像と同じように白黒画像を作成しています:http: //imageshack.us/g/33/firstwm.png/ 「ノイズ」が多いので、中央値フィルターを適用して滑らかにしましたしたがって、2番目の画像を取得します。

cvSmooth(TempImage, TempImage, CV_MEDIAN, 5, 0);

この後、輪郭を取得し、リンクから3番目の画像のような別の画像に描画します。私の問題は、輪郭がまだ少しピクセル化されている(エッジの効いた)ことです。より良い輪郭を得るために白黒画像をさらに滑らかにする方法はありますか?または多分輪郭で何かをします。異なるカーネルでDilateとErodeも試しましたが、問題は同じです。お役に立ててありがとうございます。

編集:また試した:

cvSmooth(TempImage, TempImage, CV_GAUSSIAN, 9, 9, 3);
cvThreshold(TempImage, TempImage, 127, 255, CV_THRESH_BINARY);

メディアンフィルターと同じ結果ですが、ピクセル化された輪郭が残ります。

4

1 に答える 1

8

ここに画像の説明を入力してください

これが目的のスムージング結果である場合は、ガウスぼかしを実行した後、しきい値を設定することで取得できます。つまり、パラメータとしてで使用cvSmoothCV_GAUSSIANます。が続きcvThresholdます。

しきい値処理よりもスムーズな遷移が必要な場合(このように)、レベルを調整することでそれを得ることができます(エッジ遷移の一部を保持するように色範囲を再マッピングします)。

updateしきい値処理でスムーズな(アンチエイリアス処理された)エッジを取得する方法を説明するために、しきい値処理の機能を検討してください。基本的に、画像内の各ピクセルを一度に1つずつ処理します。ピクセル値がしきい値よりも低い場合は黒(0)に設定され、そうでない場合は白(255)に設定されます。

したがって、しきい値演算子は非常に単純ですが、他の一般的なマッピング関数を使用できます。基本的に、これは関数f(i)です。ここiで、は強度ピクセル値(0〜255の範囲)でf(i)あり、はマップされた値です。しきい値の場合、この関数は単純です

 f(i) = {   0, for i  < threshold
          255, for i >= threshold

あなたが持っているのは平滑化された画像です(ガウスカーネルを使用したcvSmoothによって、それが理にかなっている場合、「最も滑らかな」平滑化を提供します)。したがって、0から255の範囲の値のソフト遷移がエッジにあります。実行したいのは、この遷移をはるかに小さくして、良好なエッジを取得することです。弾道を使用する場合は、0から255に直接移動します。これは、すでに実行した2値しきい値と同じです。

ここで、おそらく4つの強度値(127 +-4)の範囲を0〜255の全範囲にマッピングする関数について考えてみます。つまり

         f(i) = {   0,  for i  < 123
                  255,  for i >= 131
       linear mapping,  for 123 <= i < 131

そして、あなたは望ましい出力を得る。簡単に見て、openCVにすでに実装されているかどうかを確認します。ただし、自分でコーディングするのはそれほど難しいことではありません。

update2 輪郭バージョンは次のようになります。

              f(i) = { 255,  for        i < 122
   linear mapping (255->0),  for 122 <= i < 126
                         0,  for 126 <= i < 127
   linear mapping (0->255),  for 127 <= i < 131
                       255,  for 131 <= i
于 2011-09-14T13:03:18.073 に答える