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);
}

 

posted @ 2015-04-09 14:31  尹西西来当学霸  阅读(240)  评论(0)    收藏  举报