从C ++中的R,G,B像素生成图像

时间:2013-06-25 08:59:55

标签: opencv

我有一个关注代码:

   double R = (double)(img->imageData + img->widthStep*i)[j*3];
   double G = (double)(img->imageData + img->widthStep*i)[j*3+1];
   double B = (double)(img->imageData + img->widthStep*i)[j*3+2];

然后我为R,G,B设置了一些条件。 现在我想用C ++中的新像素值R,G,B生成新图像。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

嗨,你应该看一下:

#include "opencv2/opencv.hpp"
using namespace cv;

int main(int ac, char **av){

  cv::Mat src = cv::Mat(Size(1920, 1080), CV_8UC3, Scalar(0, 0, 0));
  std::vector<cv::Mat> rgbChannels;
  cv::cvtColor(src.clone(), src, CV_BGR2RGB);

  cv::split(src, rgbChannels);

  cv::Mat r = rgbChannels.at(0);
  cv::Mat g = rgbChannels.at(1);
  cv::Mat b = rgbChannels.at(2);
  unsigned char max1, max2, min1, min2, R=0,G=0,B=0;
  for (unsigned int y =0; y < r.rows; y++){
      for (unsigned int x =0; x < r.cols; x++){
          max1= (R>G)? R:G;
          max2 = (max1>B)? max1:B;
          min1= (R<G)? R:G;
          min2 = (min1<B)? min1:B;
          if( R>95 && G>40 && B> 20 && (max2-min2)>15 && (R-G)>15 && R>G && R>B) {
              r.at<uchar>(y, x)=R;
              g.at<uchar>(y, x)=G;
              b.at<uchar>(y, x)=B;
          }
      }
  }

  rgbChannels.clear();
  rgbChannels.push_back(r);
  rgbChannels.push_back(g);
  rgbChannels.push_back(b);
  cv::Mat RGBoutput;
  cv::merge(rgbChannels, RGBoutput);
  cv::imwrite("output.png", RGBoutput);
  return 0;
}

顺便说一下,如果你想对颜色进行make操作,你应该看一下HSV颜色空间,以获得更精确的结果。