星期三, 11. 一月 2017 11:47上午

这部分主要是用类处理彩色图像


像素与标量之间的差

#include "ColorDetector.h"
cv::Mat ColorDetector::process(const cv::Mat &image){
      cv::Mat output;
      cv::absdiff(image, cv::Scalar(target), output);
      std::vector<cv::Mat> images;
      cv::split(output, images);
      output=image[0]+images[1]+images[2];
      cv::threshold(
	output,
	output,
	maxDist,
	255,
	cv::THRESH_BINARY_INV
      );
      return output;
}

运行:

int main()
{
  ColorDetector cdetect ;
  cv::Mat image = cv::imread("/home/ottsion/Pictures/opencvImage/hua.jpg");
  if(image.empty())
    return 0;
  cdetect.setTargetColor(20,100,130);
  cv::namedWindow("image");
  cv::imshow("image",cdetect.process(image));
  cv::waitKey(0);
 
  return 0;
}

得出结果是:

![](../../../pic/mybolg_pic/opencv/2017-01-11 11:50:39屏幕截图.png)

转换颜色空间

CIE Lab色彩空间

L表示每个像素的亮度,ab表示颜色信息。

cv::Mat ColorDetector::process1(const cv::Mat &image){
  
  result.create(image.rows, image.cols, CV_8U);
  cv::cvtColor(image, converted, CV_BRG2LAB);
  cv::Mat_<cv::Vec3b>::iterator it = converted.begin<cv::Vec3b>();
  cv::Mat_<cv::Vec3b>::iterator itend = converted.end<cv::Vec3b>();
  cv::Mat_<uchar>::iterator itout = result.begin<cv::Vec3b>();
  for(; it!=itend; ++it, ++itout){
    ...
  }
}

YCrCb空间

jpeg压缩使用的色彩空间

CIE Luv空间

是一种感知均匀的色彩空间

CIE XYZ空间

标准色彩空间,RGB与XYZ之间的转换时线性的,Y通道对应灰度版本。

把彩色图转换为灰度图可以: cv::cvtColor(color, gray, CV::BGR2Gray)

用色调饱和度亮度表示颜色

void test2(cv::Mat image){
  std::vector<cv::Mat> nchannels;
  cv::split(image, nchannels);
  //nchannels[0]   色调
  //nchannels[1]   饱和度
  //nchannels[2]   亮度
  cv::namedWindow("色调");
  cv::namedWindow("饱和度");
  cv::namedWindow("亮度");
  cv::imshow("色调", nchannels[0]);
  cv::imshow("饱和度", nchannels[1]);
  cv::imshow("亮度", nchannels[2]);
}

![](../../../pic/mybolg_pic/opencv/2017-01-11 12:26:58屏幕截图.png)