3

我有一个大小为 320x320 像素的阈值图像。我通过设置 ROI 以 20x20 像素的块循环遍历整个图像。我需要找到每个块的平均值。所以我将这些图像块传递给函数'cvAvg'。我面临以下问题。

  1. 'cvAvg' 的返回类型是 'CvScalar',它有 4 个双精度数。我无法从文档中解释 CvScalar。我只需要一个像素的平均值,可能是“浮点”或“双”格式,我需要根据它做出其他决定。如何从函数返回值中提取单个值。我不想遍历所有像素并找到平均值。我想以 20x20 的块为单位进行处理。例如:如果 20x20 的块中有 200 个像素是白色的,200 个像素是黑色的,我希望能够提取一个值,以便我可以决定该块具有 50% 的白色像素,并且我认为是平均值/平均值将是一个很好的了解方式。

  2. 我创建了一个 CvScalar 类型的变量来检索和打印函数“cvAvg”返回的值。但是阈值图像的所有值都是相同的

0.000000 255.000000 0.000000 0.000000

0.000000 255.000000 0.000000 0.000000

0.000000 255.000000 0.000000 0.000000

0.000000 255.000000 0.000000 0.000000

由于阈值图像具有不同的白色和黑色部分,因此循环了 256 次以遍历图像的所有块,这些块不可能是正确的。这里发生了什么?代码如下。imgGreenThresh 是绿色阈值的“二进制图像”。

IplImage* imgDummy = cvCreateImage(cvGetSize(imgGreenThresh), 8, 1);    //Create a dummy image of the same size as thresholded image
cvCopy(imgGreenThresh, imgDummy);                                       //Copy the thresholded image for further operations
CvRect roi;                                                             //Rectangular ROI
CvSize size;
int r, c, N=20;
int count = 0;
float LaserState[16][16];                                               //Create 16x16 matrix to hold the laser state values.
CvScalar meanValue;                                                     // individual windows mean value

size = cvGetSize(imgDummy);                                             //returns image ROI, in other words, height and width of matrix
                                                                        //Iteratively send the different ROIs for processing.
for (r = 0; r < size.height; r += N)
    for (c = 0; c < size.width; c += N)
    {
        count++;
        roi.x = c;
        roi.y = r;
        roi.width = (c + N > size.width) ? (size.width - c) : N;
        roi.height = (r + N > size.height) ? (size.height - r) : N;
        cvSetImageROI(imgDummy, roi);
        meanValue = cvAvg(imgDummy);
        printf("%f\t%f\t%f\t%f\n", meanValue);
        cvResetImageROI(imgDummy);

    }
//cvResetImageROI(imgDummy);                                                //Do not forget to reset ROIs

谢谢!

苏迪尔。

4

2 回答 2

5

我计算单个通道平均值的解决方案可以在以下链接中找到: 单个通道的平均值

对于您的情况,您有投资回报率而不是单一渠道。在 OpenCV 中,ROI 也是一个 Mat 对象(如果您使用的是 OpenCV 的 C++ 代码),您可以将其传递给 cv::mean(...) 函数以取回一个标量对象。只有该对象的第一个条目将正确设置为您的 ROI 的平均值,这就是您想要的值。有关详细信息,请参阅上面的链接。

于 2013-07-30T15:14:17.273 回答
0

我创建了另一个变量 SingleMeanValue 并分配了 meanValue(CvScalar 类型)的第 0 个值。由于某种原因,meanvalue[0] 没有按照@lightalchemist 的建议工作。我不知道这是否应该工作,我对此很陌生。也许它在 C++ 中有效,但在 C 中这可能是正确的方法。

双 SingleMeanValue = meanValue.val[0]; 工作,下面是更新代码的输出。

0.000000 0.000000 35.062500 247.350000 109.012500 137.700000 243.525000 51.000000 0.000000 0.000000 等等。

感谢@lightalchemist 的帮助

于 2013-07-30T16:03:13.993 回答