精华内容
下载资源
问答
  • 颜色空间缩减

    2019-03-30 14:58:14
    在对单通道图像进行处理时,像素的可能值为256个,但处理多通道时,像素的处理就会相当麻烦,其实用这些颜色中具有代表性的一小部分就可以达到同样的效果,所以颜色空间缩减就可以派上用场了。思路是这样的,我们...

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

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

    展开全文
  • 基于EmguCV的颜色空间缩减的源码 EmguCV 版本 3.3.0 .net fromwork 版本 4.5.2
  • OpenCV学习(四)颜色空间缩减实现

    千次阅读 2016-07-17 11:08:57
    如果是三通道图形,那么应该有256*256*256=16581375种不同的颜色,这1600多万种颜色,数据量会很大,影响后期的处理,这个时候,我们就需要将颜色空间进行缩减。  对于三通道图像,本来有256*256*256种颜色,这里...

    在一幅数字图像存储的矩阵一般是uchar类型,为8位256个值。如果是三通道图形,那么应该有256*256*256=16581375种不同的颜色,这1600多万种颜色,数据量会很大,影响后期的处理,这个时候,我们就需要将颜色空间进行缩减。

           对于三通道图像,本来有256*256*256种颜色,这里我们取:

           0-9的像素取值:0

           10-19的像素取值:1

           ……

           250-256的像素取值:25

           这样可以形成一个26*26*26=17576种颜色,我们可以由此写出颜色空间压缩的算法:

           intdivide = 10;

           uchartable[256];

           for(inti=0;i<256;i++){

           table[i] = divide*(i/divide);

    }

    这里我们取256的原因是:三通道图像的每个通道,其都为uchar型,那么大小为0-255,一共256个数,所以我们取table的大小为256就可以覆盖所有的像素值了。

    由此我们对压缩颜色空间的思路是:对于比较大的图像,我们首先做一个类似的table,里面存储计算好的新的压缩图像可能要取的值,等到需要取值的时候,只要对table进行查找操作就可以了,无需再计算。

    访问像素的几种方法

           访问像素的方法有:用指针访问像素元素,用迭代器访问元素与动态地址计算。这里我结合上次的回调函数,写了一个用指针访问元素的例子。例子如下:

    /*
    	使用trackball控件实现色彩空间的缩减
    	
    	piaopiao9393
    */
    #include<opencv2\core\core.hpp>
    #include<opencv2\highgui\highgui.hpp>
    using namespace std;
    using namespace cv;
    
    #define WINDOW_NAME "色彩空间缩减"
    int compressValue;//压缩值设为全局变量
    const int maxValue = 100;
    Mat srcImg;//原图像
    Mat dstImg;//处理后的图像
    //编写回调函数
    void on_trackBall(int, void*);
    //编写缩减色彩控件的函数
    void colorReduce(Mat& src, Mat& dst, int compress);
    int main(int argv, char** argc) {
    	srcImg = imread("D:\\123.jpg");
    	dstImg.create(srcImg.rows, srcImg.cols, srcImg.type());
    	compressValue = 50;
    	namedWindow(WINDOW_NAME, WINDOW_NORMAL);
    	char trackName[50];
    	sprintf(trackName, "压缩值:%d", compressValue);
    	createTrackbar(trackName, WINDOW_NAME, &compressValue, maxValue, on_trackBall);
    	//将结果返回回调函数
    	int m = 9;
    	on_trackBall(compressValue, 0);
    	//按任意键退出
    	waitKey(0);
    	return 0;
    }
    void colorReduce(Mat& src, Mat& dst, int compress) {
    	dst = src.clone();
    	int rowNumber = src.rows;
    	int colNumber = src.cols*src.channels();
    	for (int i = 0; i < rowNumber; i++) {
    		uchar* data = dstImg.ptr<uchar>(i);
    		for (int j = 0; j < colNumber; j++) 
    			//注意,这里compressValue不能取0,否则会有问题
    			data[j] = (data[j] / compressValue)*compressValue;
    		}
    	}
    
    void on_trackBall(int, void*) {
    	colorReduce(srcImg, dstImg, compressValue);
    	imshow(WINDOW_NAME, dstImg);
    }

    代码运行结果如下:


    展开全文
  • 1、颜色空间缩减 颜色空间缩减的做法是:将现有颜色空间值除以某个输入值,以获得较少的颜色数。即做减法,比如颜色值0到9可取为新值0,10到19可取为10,以此类推。 有一个简单的公式来实现颜色空间缩减: 在处理...

    1、颜色空间缩减

    颜色空间缩减的做法是:将现有颜色空间值除以某个输入值,以获得较少的颜色数。即做减法,比如颜色值0到9可取为新值0,10到19可取为10,以此类推。

    有一个简单的公式来实现颜色空间缩减:

    在处理像素时,每个像素需要进行一遍上述公式计算,也需要一定的时间花销。我们可以把256中计算好的结果提前存在列表table中,这样每种情况不需计算,直接从table中取取结果即可。

    int divideWith = 10;
    unchar table[256];
    for( int i =0; i<256; ++i)
        table[i] = divideWith*(i/divideWith);

    于是table[i]存放的是值为 i 的像素减小颜色空间的结果,这样就可以理解上述方法中的操作:p [j] = table[ p [j] ]

    简单的颜色空间缩减算法就由以下两步组成:

    1. 遍历图像矩阵的每一个像素
    2. 对像素应用上述公式

    2、LUT函数:Look up table操作

    Look up table操作使用operationsOnArrays:LUT()<lut>函数,用于批量进行图像元素查找、扫描与操作图像。使用方法如下:

    //首先建立一个mat型用于查表
    Mat lookUpTable(1, 256, CV_8U);
    uchar* p = lookUpTable.data;
    for(int i = 0; i < 256; ++i)
        p[i] = table[i];
    
    //调用函数(I是输入,J是输出)
    for (int i = 0; i < times; ++i)
        LUT(I, lookUpTable, J);
    展开全文
  • 本代码主要实现了图片的颜色缩减,并计算缩减过程消耗的时间。颜色缩减,通俗来讲就是图片压缩。压缩力度越大,颜色越单调,但是所占用的空间就会越小。
  • 颜色空间缩减公式 //---------------------------------【头文件、命名空间包含部分】-------------------------- // 描述:包含程序所使用的头文件和命名空间 //---------------------------------------------...

    颜色空间缩减公式      Inew=(\frac{iold}{10})*10

    //---------------------------------【头文件、命名空间包含部分】--------------------------
    //		描述:包含程序所使用的头文件和命名空间
    //-----------------------------------------------------------------------------------------------
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <iostream>  
    using namespace std;  
    using namespace cv;  
    
    //-----------------------------------【全局函数声明部分】-----------------------------------
    //          描述:全局函数声明
    //-----------------------------------------------------------------------------------------------
    void colorReduce(Mat& inputImage, Mat& outputImage, int div);  
    void ShowHelpText();
    
    
    
    //--------------------------------------【main( )函数】---------------------------------------
    //          描述:控制台应用程序的入口函数,我们的程序从这里开始执行
    //-----------------------------------------------------------------------------------------------
    int main( )  
    {  
    	//【1】创建原始图并显示
    	Mat srcImage = imread("1.jpg");  
    	imshow("原始图像",srcImage);  
    
    	//【2】按原始图的参数规格来创建创建效果图
    	Mat dstImage;
    	dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同 
    
    	ShowHelpText();
    
    	//【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);  
    }  
    
    
    //---------------------------------【colorReduce( )函数】---------------------------------
    //          描述:使用【指针访问:C操作符[ ]】方法版的颜色空间缩减函数
    //----------------------------------------------------------------------------------------------
    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 + div/2;  
    			// ----------【处理结束】---------------------
    		}  //行处理结束
    	}  
    }  

     

    展开全文
  • 1.颜色空间缩减及查找表设想一种简单的C\C++类型的无符号字符型矩阵的存储结构,对于单通道图像而言,图像像素最多可以由256个像素值。如果图像是三通道图像,那么图像像素存储的颜色可以达到惊人的1600w。处理如此...
  • 1.颜色空间缩减算法使用

    千次阅读 2017-08-01 10:22:21
    使用opencv对图像的像素点进行操作。 Mat的矩阵数值部分是怎么存储的: 如果图像是一幅灰度图像,他就像这样,从左到右,从上到下,依次是矩阵的每一行每一列,这时候矩阵M(i,j)的值自然就是当前点的灰度值了。...
  • //---------------------------------【头文件、命名空间包含部分】--------------------------// 描述:包含程序所使用的头文件和命名空间//-------------------------------------------------------------------...
  • opencv颜色空间缩减

    2021-11-27 19:48:39
    #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> #include<vector>... //颜色空间缩减,在实际图像处理中,仅用颜色中具有代表.
  • LUT是look up table的缩写,中文解释:显示查找表,实际意义很简单易懂。 举个例子,如果是单通道的图像,灰度梯度是0~255,即分为...左图为原图,右图通过20为一级的颜色空间缩减(0~19为0, 20~39为20 以此类推)
  • 颜色空间缩减的做法是:将现有颜色空间值除以某个输入值,以获得较少的颜色数。也就是“做减法”,比如颜色值0到9可取为新值0, 10到19可取为10,以此类推。如uchar类型的三通道图像,每个通道取值可以是0~255,于是就有256...
  • 五、颜色空间缩减

    2017-05-04 19:14:46
    一、目的 如果采用3通道颜色空间,比如RGB(其在opencv中储存为BGR)。 如果一个元素采用unsigned char ,则有256个数值,3个元素则需要16777216
  • opencv颜色空间缩减

    2019-01-07 20:05:58
    若矩阵存储的是单通道像素和三通道像素就会有非常多的颜色,所以就会有颜色空间缩减这一个说法:颜色空间值除以某个输入值,以获得较少的颜色数,也就是做减法,比如颜色值0-9可以取0,10-19可以取到10,颜色缩减的...
  • color space reduction色彩空间缩减,是为了减少色彩总量,降低软硬件消耗.以RGB 0~255 颜色空间为例,总共有256^3=16777216种色彩,为了减少色彩总量,可以增大量化阶梯,将256个颜色值通过一定方式减少,从而使总的色彩...
  • EmguCV 颜色空间缩减

    2017-12-01 18:09:30
    图像处理过程中经常会针对图像的颜色进行计算,一个使用byte类型的数组存储的3通道图像,其可以表示的颜色一共有16,777,216种,要对这么多种颜色进行计算,其消耗是非常大的,所以通常会将颜色空间进行缩减。...
  • #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace std; using namespace cv; void colorReduce(Mat& in...
  • 颜色空间缩减 //使用动态地址遍历 for ( int i = 0 ; i ; i++ ) { for ( int j = 0 ; j ; j++ ) { for ( int c = 0 ; c 3 ; c++ ) { dst.at (i, j)[c] = (src.at(i, j)[c] / div) * div; //...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,988
精华内容 2,395
关键字:

颜色空间缩减