2016-07-18 12 views
2

私はポインターによる平均スムージングを実行しようとしています。イメージを使用したイメージのスムージングポインタを使用したスムージング

私の目的は、ポインタで画像を処理することです。

これは私がコード化したものです。

コード:

int main() { 

    Mat img = imread("best-testimg.jpg"); 

    Mat src = img.clone(); 

    int const templeteWindowSize = 3; 

    int tr = templeteWindowSize >> 1; //templateRegion 

    int bb = tr;     //backgroundBorder 

    //create large size image for bounding box; 
    Mat im; 
    copyMakeBorder(src, im, bb, bb, bb, bb, cv::BORDER_DEFAULT); //left= right= bottom= top = border = bb 

    //========================================================= 

    Mat dest = Mat::zeros(src.size(), src.type()); 

    int T = templeteWindowSize * templeteWindowSize; 

    int count = T - 1; 

    //step of template to image 
    const int cstep = im.step - templeteWindowSize; 

    for (int j = 0; j < src.rows; j++) { 

     //src ptr 
     uchar* d = dest.ptr(j); 

     for (int i = 0; i < src.cols; i++) { 

      uchar* tprt = im.data + im.step*(tr + j) + (tr + i); //pointer of image data amd step at 3x3 

      double tweight = 0.0; 
      for (int n = templeteWindowSize; n--;) 
      { 
       for (int m = templeteWindowSize; m--;) 
       { 
        tweight += *tprt++; 
       } 
       tprt += cstep; 
      } 
      tweight /= 9; 
      *(d++) = (saturate_cast<uchar>(tweight)); 
     }//i 

    }//j  
    imshow("dest", dest); 
    waitKey(0); 
    return 0; 
} 

入力画像:

enter image description here

出力イメージ

enter image description here

問題:画像がポインタでうまく処理されません。コードで私の間違いを訂正することはできますか?ありがとう

誰でも私のコードを修正するのに手伝ってください。ありがとう。

+0

は、次のようなOpenCVの関数を使用して画像を滑らかにするために、多様な線形フィルタを適用しよう.html –

+0

私はポインタで作業することに興味があります。平均スムージングのみ。 – Abc

答えて

1

を使用すると、チャンネル数を考慮していないので、唯一の画像の第三が処理されるようだ

Mat src = imread("best-testimg.jpg", IMREAD_GRAYSCALE); 

を試してみてください。 ぼかし GaussianBlur medianBlur bilateralFilter http://docs.opencv.org/2.4/doc/tutorials/imgproc/gausian_median_blur_bilateral_filter/gausian_median_blur_bilateral_filter:

+0

私はグレースケールの画像だけで作業する必要があります。 – Abc

+1

はい、画像はグレースケールですが、imread()にヒントを与えなければなりません。そうでなければ、3つの同一チャンネルの画像を返します。 – bgp2000

+0

ああ、そうです。私はIMREAD_GRAYSCALEを追加することを忘れました。 ありがとう:) – Abc

1

まず、コードを確認する必要があります。

  • はなぜintern_count destがどのような場合にはデ国境

を避けるために、同じTRのステップが含まれていない理由を

  • は、最後に見てみましょう:例えば、オーバーホールを必要とするようですライン。最初にsaturate_castを9で割る前にsaturate_castを実行します。最初に分割してキャストします。

  • +0

    ありがとうございます、はい私はそれを修正しました。私はここでもコードを編集します。 – Abc

    +0

    私はintern_countのような無駄な変数を削除しました。 } また、私はボーダー 'イム'画像を編集しました。 borderを持たない 'dest'イメージにaverageを与え、値を代入します。 。 そのため、destイメージポインタに同じtrを追加できません。 – Abc

    関連する問題