从不同平面中选择最大值

时间:2012-01-19 08:34:20

标签: c++ opencv

我希望从两张图片中获取最大值,同时保留其他信息。

例如,我有两个HSL格式的图像,我希望得到的图像由最亮的像素组成。 (这是一个例子,实际上我无法转换为RGB,找到最大值,然后转换回来)

所以我不能使用cvMax因为它会分别给我最大H,最大S和最大L。

我需要的是来自任一图像的最大L的图像,以及来自同一图像的H和S值(或其他信息)。

例如,考虑这些2x1像素图像及其HSV标量:

IplImage* img1 = cvCreateImage(cvSize(2, 1), IPL_DEPTH_32F, 3);
cvSet2D(img1, 0, 0, cvScalar(1, 2, 45)); // Remember: HSV values
cvSet2D(img1, 0, 1, cvScalar(3, 4, 123));
IplImage* img2 = cvCreateImage(cvSize(2, 1), IPL_DEPTH_32F, 3);
cvSet2D(img1, 0, 0, cvScalar(5, 6, 114));
cvSet2D(img1, 0, 1, cvScalar(7, 8, 33));

IplImage* result = cvCreateImage(cvSize(2, 1), IPL_DEPTH_32F, 3);

//Do something to get the brightest pixels

CvScalar px0 = cvGet2D(result, 0, 0);
CvScalar px1 = cvGet2D(result, 0, 1);

cout << px0.val[0] << " " << px0.val[1] << " " << px0.val[2] << endl;
cout << px1.val[0] << " " << px1.val[1] << " " << px1.val[2] << endl;

输出应该变为:

5 6 114
3 4 123

有没有一种巧妙的'OpenCV'方法,而不是制作我自己的,可能更慢的解析每个像素的算法?


只是一个想法,但我可以这样做吗?

  • 将它们分成6个灰度图像,(实际上,我已经有了这种情况,所以我不需要拆分)
  • 拍摄两张V图像,
  • 生成每个元素的地图(1U或8U图像),其中“0”或“1”值分别表示第一个或第二个图像中的最高值。
  • 使用此选项组合其他平面中的选定像素。

大胆的一步是我陷入困境。

1 个答案:

答案 0 :(得分:2)

没有内置的opencv功能,但编写自己的功能并不困难。

你可以简单地

for(i=0;i<h;i++)
   for (j=0;j<w;j++)
      dst[j+w*i] = (src1[j+w*i]>src2[j+w*i])?src1[]:src2[];

当然,可以进行一些小的优化,比如预先计算j + w * i,或使用指针访问而不是数组索引。