您的位置:首页 > 运维架构

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

2018-04-11 19:54 866 查看

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

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: