Opencv学习笔记之01扫描图像,操作像素
任何图像处理算法,都是从操作每个像素开始的。即使你不会使用OpenCV提供的各种图像处理函数,只要你了解图像处理算法的基本原理,也可以写出具有相同功能的程序。在OpenCV中,下面两种方式是最快的。
1.指针访问
void colorReduce(Mat& inputImage, Mat& outputImage, int div) { outputImage = inputImage.clone(); int rows = outputImage.rows; int cols = outputImage.cols*outputImage.channels(); for(int i = 0;i < rows;i++) { uchar* data = inputImage.ptr<uchar>(i); uchar* dataout = outputImage.ptr<uchar>(i);//定义指针 for(int j = 0;j < cols;j++) { dataout[j] = dataout[j]/div*div + div/2; } } }
2.调用LUT函数访问
何为LUT,就是指显示查找表(Look-Up-Table),(LUT(Look-Up Table)实际上就是一张像素灰度值的映射表,它将实际采样到的像素灰度值经过一定的变换如阈值、反转、二值化、对比度调整、线性变换等,变成了另外一个与之对应的灰度值,这样可以起到突出图像的有用信息,增强图像的光对比度的作用。) 查找表就是将0~255个灰度值量化后的结果提前计算好存储在一个表,有了查找表后,要对图像中的像素灰度值进行替换,OpenVC提供了使用查找表直接计算出量化灰度级后图像的函数——LUT
这是最被推荐的用于实现批量图像元素查找和更该操作图像方法。在图像处理中,对于一个给定的值,将其替换成其他的值是一个很常见的操作,OpenCV 提供里一个函数直接实现该操作,并不需要你自己扫描图像,就是:operationsOnArrays:LUT() <lut> ,一个包含于core module的函数. 首先我们建立一个mat型用于查表:
void colorReduce(Mat& inputImage, Mat& outputImage, int div){ Mat lookUpTable(1, 256, CV_8U); uchar* p = lookUpTable.data; for( int i = 0; i < 256; ++i) p[i] = div*(i/div)+div/2; LUT(InputImage, lookUpTable, OutputImage); }