opencv学习(十)颜色缩减 // 查表 // 计时 // 访问像素的三个方法(指针/STL迭代器(待详细了解)/动态地址)//历遍图像的14种方法

1,图像储存方式

这里写图片描述

2,颜色缩减

这里写图片描述
这里写图片描述
这里写图片描述

3,查表 look up table

这里写图片描述
这里写图片描述

4,计时函数

这里写图片描述

实例 颜色空间缩减如256*256→26*26(访问每个像素)

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

void colorReduce(Mat& inputImage, Mat& outputImage, int div);//全局函数说明

int main()
{
    Mat scrimage = imread("D://Bild.jpg");//注意路径格式
    imshow("原图", scrimage);


    Mat dstimage;
    dstimage.create(scrimage.rows, scrimage.cols, scrimage.type());//构造与原图,行数,列数,类型相同 Mat&inputImage,Mat&outputImage,int div
    double time0 = static_cast<double>(getTickCount());//记录起始时钟周期数
    colorReduce(scrimage, dstimage, 64);
    time0 = ((double)getTickCount() - time0) / getTickFrequency();//过程时间=(终止时钟周期数-起始时钟周期数)/一秒钟走过的时钟周期数(频率)
    cout << "此方法运行时间为:" << time0 << "秒" << endl;//输出
    imshow("效果图", dstimage);
    waitKey(0);
}
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
    outputImage = inputImage.clone();//复制实参到临时变量
    int rowNumber = outputImage.rows;
    int colNumber = outputImage.cols*outputImage.channels();//行数,列数(cols*通道数)
    for (int i = 0; i < rowNumber; i++)//行循环
    {
        uchar* data = outputImage.ptr<uchar>(i);
        for (int j = 0; j < colNumber; j++)
        {
            data[j] = data[j] / div * div + div / 2;
        }

    }


}

5,访问像素的三个方法

5.1,采用指针法(类似c语言,最快)

具体代码如上图所示,快是因为将三通道数据看成一样的(未划分开),依次操作,其他两种方法按通道类别来分别处理

void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
    outputImage = inputImage.clone();//复制实参到临时变量
    int rowNumber = outputImage.rows;
    int colNumber = outputImage.cols*outputImage.channels();//行数,列数(cols*通道数)
    for (int i = 0; i < rowNumber; i++)//行循环
    {
        uchar* data = outputImage.ptr<uchar>(i);
        for (int j = 0; j < colNumber; j++)
        {
            data[j] = data[j] / div * div + div / 2;
        }

    }


}

5.2,STL迭代器法(待详细了解)

这里写图片描述

void colorReduce(Mat& inputImage, Mat& outputImage, int div)//采用STL迭代器方法
{
    outputImage = inputImage.clone();//复制实参到临时变量
    Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();//初始位置迭代器
    Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>();//终止位置迭代器
    for (; it !=itend; it++)
    {
            (*it)[0] = (*it)[0] / div * div + div / 2;
            (*it)[1] = (*it)[1] / div * div + div / 2;
            (*it)[2] = (*it)[2] / div * div + div / 2;//对三个通道的每个像素都进行操作

    }


}

5.3,动态地址(更直观,时间相对较长)

void colorReduce(Mat& inputImage, Mat& outputImage, int div)
{
    outputImage = inputImage.clone();//复制实参到临时变量
    int rowNumber = outputImage.rows;
    int colNumber = outputImage.cols;//行数,列数
    for (int i = 0; i < rowNumber; i++)//行循环
    {

        for (int j = 0; j < colNumber; j++)
        {
            outputImage.at<Vec3b>(i,j)[0]= outputImage.at<Vec3b>(i, j)[0] / div * div + div / 2;
            outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div * div + div / 2;
            outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div * div + div / 2;
        }

    }


}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41553038/article/details/79899767
今日推荐