如何在OpenCV中屏蔽浮点图像?

时间:2011-12-29 03:17:04

标签: c image-processing opencv

我有一个Nx1浮点值矩阵。我希望只获得从22ndNth项的那些值的平均值。我创建了Nx1维度的二进制掩码,将0s放在[0,21]范围内,将1s放在其余范围内。在计算平均值时应用该掩码(使用内置函数获得最大速度)会产生错误。代码段如下所示。

错误是:

  

输入参数的大小在cvSvg()"

中不匹配

正确的面具应该是什么?我已经尝试在掩码中使用浮点而不是整数,但仍无效。

CvMat mask;
int i;
int N = img->width;
IplImage* W = cvCreateImage( cvSize(N, 1), IPL_DEPTH_32F , 1 );
IplImage* A = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F , 1 );
cvConvertScale(img, A);
int* vals = (int*)malloc(N*sizeof(int));

for(i=0; i<N; i++)
{
    if(i<22)
        vals[i] = 0;
    else
        vals[i] = 1;
}
cvInitMatHeader(&mask, N, 1, CV_8U, vals);

cvSVD(A, W, NULL, NULL, CV_SVD_MODIFY_A);

CvScalar mean = cvAvg(W, &mask);

2 个答案:

答案 0 :(得分:1)

这是我用一个人为的例子计算掩码的方法,但看起来效果很好。

int main(int argc, char* argv[])
{
    int N = 50;
    CvMat* a = cvCreateMat(1, N, CV_32FC1);
    CvMat* mask = cvCreateMat(1, N, CV_8UC1);

    float* aData = a->data.fl;
    uchar* maskData = mask->data.ptr;

    for(int i = 0; i < a->cols; i++)
    {
        aData[i] = (float)i;

        if(i < 22)
        {
            maskData[i] = 0;
        }
        else
        {
            maskData[i] = 1;
        }
    }

    CvScalar avg = cvAvg(a);
    cout << "Average without mask: " << avg.val[0] << endl;

    avg = cvAvg(a, mask);
    cout << "Average with mask: " << avg.val[0] << endl;

    cvReleaseMat(&a);
    cvReleaseMat(&mask);
    return 0;
}

这会产生以下输出:

Average without mask: 24.5
Average with mask: 35.5

因此,它适用于这个简单的例子。希望这会让你再次前进。

答案 1 :(得分:0)

你用作掩码的图像不一定是双倍的,但Uint,我认为代码很好,不太确定掩码的初始化。 你仍然必须声明W如下

IplImage * W = cvCreateImage(cvSize(N,1),IPL_DEPTH_8U,1);