在一些场合中我们并不能直接将图片转化为灰度图像来处理(在灰度图像中每个像素点是一个0~255的数值,而在彩色图像中,每个像素点是一个三维坐标系中的一个空间的点),虽然灰度图像可以减少计算量,加快处理速度,但在灰度处理过程中,同样也损失了很多图像特征。例如我们在提取一个图像的前景时需要不改变前景的像素特征时,或我们希望能识别出多张相识图像中的不同特征时,往往需要直接在彩色图片上做处理。同样彩色图片的直方图也可以给我们的处理提供图片信息。
彩色图片获取直方图的原理:前面有提到,彩色图像的每个像素点是由三维空间的向量组成,分别为R、G、B。那样只要我们分别提取每个像素分量的值,进行统计便可得到个分量的灰度直方图了。
实例:(获取彩色图片的前景)
1.读取图像
2.获取图像RGB三通道灰度直方图
3.提取背景像素阈值
4.以操作像素的方式将背景图片设置成白色(255,255,255),不改变前景
5.显示前景图像
实例现象:
实例代码:
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include "histoRGBIME.h"
#include "getForeground.h"
using namespace std;
int main()
{
cv::Mat grayImage;
cv::Mat histImage;
cv::Mat binaryImage;
histoRGBIME rgbhist;
getForeGround foreb;
cv::Mat image = cv::imread("1.png");
if (image.empty())
{
cout << "read image is failure" << endl;
exit(0);
}
cv::resize(image, image, cv::Size(image.cols / 2, image.rows / 2));
cv::imshow("Origin Image", image);
rgbhist.outputHistogram(image);
cv::Mat foreground;
foreb.outForeground(image, foreground, 30, 60, 25, 50, 10, 50);
cv::imshow("foreGround",foreground);
waitKey(0);
}