一、先来看一个通过图像遍历进行图像降彩色(Color Reduce)的例子:
遍历图像的最基本方式:at<typename>(i,j)
Mat类提供了一个at的方法用于取得图像上的点,它是一个模板函数,可以取到任何类型的图像上的点。下面我们通过一个图像处理中的实际来说明它的用法。
在实际应用中,我们很多时候需要对图像降色彩,因为256*256*256实在太多了,在图像颜色聚类或彩色直方图时,我们需要用一些代表性的颜色代替丰富的色彩空间,我们的思路是将每个通道的256种颜色用64种代替,即将原来256种颜色划分64个颜色段,每个颜色段取中间的颜色值作为代表色。
void colorReduce(Mat& image, int div)
{
//split(image, channelsRGB);
for (int i = 0; i<image.rows; i++)
{
for (int j = 0; j<image.cols; j++)
{
image.at<Vec3b>(i, j)[0] = image.at<Vec3b>(i, j)[0] / div*div + div / 2;
image.at<Vec3b>(i, j)[1] = image.at<Vec3b>(i, j)[1] / div*div + div / 2;
image.at<Vec3b>(i, j)[2] = image.at<Vec3b>(i, j)[2] / div*div + div / 2;
}
}
}
int main()
{
Mat image = imread("123.jpg");
imshow("input",image);
colorReduce(image, 64);
waitKey(0);
imshow("output", image);
cout << image << endl;
waitKey(0);
return 0;
}
可见图像经过降色彩(Color Reduce)后,像素值只有“32,96,160,224”共四个值。
二、下面再看一个图像彩色直方图统计的例子:
HistogramND.hpp
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
class HistogramND{
private:
Mat image;//源图像
int hisSize[1], hisWidth, hisHeight;//直方图的大小,宽度和高度
float range[2];//直方图取值范围
const float *ranges;
//Mat channelsRGB[3];//分离的BGR通道
vector<Mat> channelsRGB;
MatND outputRGB[3];//输出直方图分量
public:
HistogramND(){
hisSize[0] = 256;
hisWidth = 400;
hisHeight = 400;
range[0] = 0.0;
range[1] = 255.0;
ranges = &range[0];
}
//导入图片
bool importImage(String path){
image = imread(path);
//bool