颜色空间缩减

在对单通道图像进行处理时,像素的可能值为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);
}

结果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值