在对单通道图像进行处理时,像素的可能值为256个,但处理多通道时,像素的处理就会相当麻烦,其实用这些颜色中具有代表性的一小部分就可以达到同样的效果,所以颜色空间缩减就可以派上用场了。思路是这样的,我们可以把0-9范围的像素值取为0;10~19范围的取为1;也就是通过舍掉余数的方式得到较少的像素值。
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp> //opencv申明
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
//参数准备
outputImage = inputImage.clone(); //拷贝实参到临时变量
int rowNumber = outputImage.rows;//行数
int colNumber = outputImage.cols*outputImage.channels();//列数 x 通道数=每一行元素的个数
for (int i = 0; i < rowNumber; i++)
{
uchar* data = outputImage.ptr<uchar>(i);//获取第i行的首地址
for (int j = 0; j < colNumber; j++)
{
// ---------【开始处理每个像素】-------------
data[j] = data[j] / div * div ;
}
}
}
int main()
{
//【1】创建原始图并显示
Mat srcImage = imread("C:\\Users\\Administrator\\Desktop\\3.jpg");
imshow("原始图像", srcImage);
//【2】按原始图的参数规格来创建创建效果图
Mat dstImage;
dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//效果图的大小、类型与原图片相同
//【3】记录起始时间
double time0 = static_cast<double>(getTickCount());
//【4】调用颜色空间缩减函数
colorReduce(srcImage, dstImage, 32);
//【5】计算运行时间并输出
time0 = ((double)getTickCount() - time0) / getTickFrequency();
cout << "\t此方法运行时间为: " << time0 << "秒" << endl;//输出运行时间
//【6】显示效果图
imshow("效果图", dstImage);
waitKey(0);
}
还可以这样,二者稍有区别
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp> //opencv申明
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat colorReduce(Mat& outputImage, const uchar *table)
{
//参数准备
int rowNumber = outputImage.rows;//行数
int colNumber = outputImage.cols*outputImage.channels();//列数 x 通道数=每一行元素的个数
for (int i = 0; i < rowNumber; i++)
{
uchar* data = outputImage.ptr<uchar>(i);//获取第i行的首地址
for (int j = 0; j < colNumber; j++)
{
data[j] = table[data[j]];
}
}
return outputImage;
}
int main()
{
//【1】创建原始图并显示
Mat srcImage = imread("C:\\Users\\Administrator\\Desktop\\3.jpg");
imshow("原始图像", srcImage);
//【2】按原始图的参数规格来创建创建效果图
Mat dstImage;
//dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//效果图的大小、类型与原图片相同
//【3】记录起始时间
double time0 = static_cast<double>(getTickCount());
int devide = 20;
uchar table[256];
for(int i = 0;i<256;i++)
{
table[i] = i/devide*devide;
}
dstImage = colorReduce(srcImage, table);
//【5】计算运行时间并输出
time0 = ((double)getTickCount() - time0) / getTickFrequency();
cout << "\t此方法运行时间为: " << time0 << "秒" << endl;//输出运行时间
//【6】显示效果图
imshow("效果图", dstImage);
waitKey(0);
}
结果如下