2017-11-02 38 views
0

私は非常に高い精度でリアルタイムの形状と色の分類システムを行っています。私の前処理フェーズが十分ではないように思えるので、結果は私が期待したほど正確ではありません。私がやっていることは次のとおりです。リアルタイム画像処理:HSV画像のノイズ(openCV)

  1. カメラからデータを取り込んでROIを受け取ることができます。
  2. RGBからHSV空間にROIイメージを変換します。
  3. メディアンフィルタを使用してHSV画像のノイズを低減します。
  4. しきい値四角形オブジェクトを検出するfindContoursとapproxPolyDPを用いた画像
  5. に小孔と小さなオブジェクトを除去するために拡張および浸食用いた画像

これは私の前段階である:

image_cv = cv::cvarrToMat(image_camera); 
Mat cropped = image_cv(cv::Rect(0, 190, 640, 110)); 
imshow("origin", cropped); 
Mat croppedCon = CropConveyor(cropped); 
cv::cvtColor(croppedCon, croppedCon, CV_RGB2HSV); 
medianBlur(croppedCon, croppedCon, 3); 
cv::Mat binRect; 
cv::inRange(croppedCon, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), binRect); 

これは正方形を検出するためのコードです:

vector<vector<Point>> contours; 
findContours(binarizedIm, contours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); 

vector<Point> approx; 
for (size_t i = 0; i < contours.size(); i++) 
{ 
    //double arclength = arcLength(Mat(contours[i]), true); 
    approxPolyDP(Mat(contours[i]), approx, 3.245 , true); //0.04 for wood 
    if (approx.size() != 4) continue; 
    if (isContourConvex(Mat(approx)) && contourArea(Mat(approx)) > 250) 
    { 
     double MaxCos = 0; 
     for (int j = 2; j < 5; j++) 
     { 
      double cos = angle(approx[j % 4], approx[j - 1], approx[j - 2]); 
      MaxCos = MAX(cos, MaxCos); 
     } 

     if (MaxCos < 0.2) 
      squares.push_back(approx); 
    } 
} 

私はHSVの画像のノイズが主な理由だと思います。ここに私の問題を説明するいくつかの画像があります。 HSV Imageでノイズが多く見えたので、ノイズを減らすためにメディアフィルタを使用しましたが、findContours関数を使用するときにエッジ情報が非常に重要と考えるので、エッジを保存しています。 HSV and HSV in separate channels 私の質問は次のとおりです。

  • のHSV画像のノイズとは何か、上記の画像を参照して、どのように私は私のイメージの品質を向上させる ことができますか?
+0

照明を改善したり、露出を増やすことは可能でしょうか?より大きな開口部、またはそれ以上のISO? –

+0

より良いカメラをお試しください。大学から借りることができるかもしれません。ベトナムでも、適切な機器にアクセスできない場合は、より良いウェブカメラを手に入れることができます。カメラの距離を縮めることで、横方向の解像度を効果的に倍増させることができます。あなたの視野のほとんどは未使用です。 – Piglet

答えて

2

飽和画像のノイズの原因は入力画像のノイズです。悪いカメラ/光学系によって引き起こされ、さらにJPEG圧縮によって増加した。

これは私が何年も見た中で最も悪いイメージです。あなたは火星に住んでいて明日の結果が必要な場合を除いて、別の秒を処理に費やすべきではありません。

あなたの入力画像は、ノイズが多い、アンダーサンプリングされた、焦点が合わされていない、露出不足の、エイリアシングと圧縮アーチファクトがあります。信号処理の

まずルール:

アウト=がらくたで

がらくたは、基本的には自由のためのより良いカメラを得ることができます。 1つを見つけて使用します。

1

問題の一部は、HSVスペースでノイズリダクションを実行していることです。あなたの例では、VチャンネルがHとSよりも優れた振る舞いをしていることがわかります。RGBでノイズリダクションを行う方が良いでしょう(より線形で、もちろん、ガンマ補正もあります)。

バイラテラルフィルタのようなエッジ保存ノイズ低減フィルターを考えてみることもできます。

1

なぜオブジェクトをセグメント化するためにHSVを使用しているのですが、RGB画像で十分です。画像を3つのチャンネル(r、g、b)に分け、それらに適応しきい値を適用します。拡大縮小してから、3つのバイナリイメージを1つのバイナリイメージに追加します(マージはしません)。最後にレシピのレベル6でオブジェクトを抽出します。ノイズが依然として結果に影響する場合は、しきい値の前のr、g、bチャンネルにバイラテラルフィルタを適用します。