2017-06-12 3 views
4

私は画像処理に取り組んでおり、Matlabのconv2と同等のC++ OpenCVを知る必要があります。
私はthis linkを見つけましたが、私の要求に合っていません。opencvのConv2

私が直面している問題は、上記のリンクでは示されていない2-Dダブル配列でMat画像を畳み込む必要があるということです。

MathWorks社のMATLABコードは次のとおりです。

Mx = { 
    {0, 0, 0, 0, 0, 0} , 
    {0, -0.0003, -0.0035, 0, 0.0035, 0.0003} , 
    {0, -0.0090, -0.0903, 0, 0.0903, 0.0090} , 
    {0, -0.0229, -0.2292, 0, 0.2292, 0.0229} , 
    {0, -0.0090, -0.0903, 0, 0.0903, 0.0090} , 
    {0, -0.0003, -0.0035, 0, 0.0035, 0.0003} 
}; 

ありがとう

img = conv2(img1,Mx,'same') 

答えて

5

ソリューション

使用OpenCVののfilter2D機能。

コード例

//initializes matrix 
cv::Mat mat = cv::Mat::ones(50, 50, CV_32F); 

//initializes kernel 
float Mx[36] = { 0, 0, 0, 0, 0, 0 , 
    0, -0.0003, -0.0035, 0, 0.0035, 0.0003 , 
    0, -0.0090, -0.0903, 0, 0.0903, 0.0090 , 
    0, -0.0229, -0.2292, 0, 0.2292, 0.0229 , 
    0, -0.0090, -0.0903, 0, 0.0903, 0.0090 , 
    0, -0.0003, -0.0035, 0, 0.0035, 0.0003 
}; 
cv::Mat kernel(6, 6, CV_32F, Mx); 

//convolove 
cv::Mat dst; 
cv::filter2D(mat, dst, mat.depth(), kernel); 
+0

しかし、私聞こえますが、Filter2Dは畳み込みではなく相関を行いますか? – RAM

+0

いいえ、OpenCVのドキュメントから: "filter2D - イメージをカーネルと畳み込む" – drorco

+0

しかし、同じドキュメントでは、「関数は実際には相関を計算するのではなく、畳み込みを計算します。つまり、カーネルはアンカーポイントの周りにミラーリングされません。実際の畳み込みが必要な場合は、 )、新しいアンカーを(kernel.cols - anchor.x - 1、kernel.rows - anchor.y - 1)に設定してください。 " これはどうですか? – RAM

2

はここで、私はそれが正確なのかどうかわからないんだけど、テストデータのごく少量のために、それは私のために働いていた私の試みです:

enum Conv2DShape { 
    FULL, 
    SAME, 
    VALID, 
}; 

Mat conv2D(const Mat& input, const Mat& kernel, const Conv2DShape shape){ 
    Mat flipped_kernel; 
    flip(kernel, flipped_kernel, -1); 

    Point2i pad; 
    Mat result, padded; 

    switch(shape) { 
     case SAME: 
      padded = input; 
      pad = Point2i(0, 0); 
      break; 

     case VALID: 
      padded = input; 
      pad = Point2i(kernel.cols - 1, kernel.rows - 1); 
      break; 

     case FULL: 
      pad = Point2i(kernel.cols - 1, kernel.rows - 1); 
      copyMakeBorder(input, padded, pad.y, pad.y, pad.x, pad.x, BORDER_CONSTANT); 
      break; 

     default: 
      throw runtime_error("Unsupported convolutional shape"); 
    } 

    Rect region = Rect(pad.x/2, pad.y/2, padded.cols - pad.x, padded.rows - pad.y); 
    filter2D(padded, result , -1, flipped_kernel, Point(-1, -1), 0, BORDER_CONSTANT); 

    return result(region); 
}