opencv中对图像像素点访问的三种方法利用程序进行解读

代码放到自己的工程中,运行就可以的
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include
using namespace std;
using namespace cv;
//用指针访问像素是最常用的方法,处理速度快,时间短。
void colorReduce(Mat& inputImage,Mat& outputImage,int div)
{
outputImage=inputImage.clone();
int rowNumber=outputImage.rows;
int colNumber=outputImage.colsoutputImage.channels();//列数乘以通道数等于每一行元素的个数
//遍历每一个元素
for(int i=0;i<rowNumber;i++)//行数的循环
{
uchar
data=outputImage.ptr(i);//获取第i行的首地址接下来就可以用data访问每一行
for(int j=0;j<colNumber;j++)
{
//开始处理每个像素点的三通道
data[j]=data[j]/divdiv+div/2;
}
}
}
//用迭代器操作像素我们仅仅只需要获取图像矩阵的begin和end,将迭代指针前添加
既可以访问当前指向的内容
void colorReduce(Mat& inputImage,Mat& outputImage,int div)
{
outputImage=inputImage.clone();
Mat_::iterator it=outputImage.begin();//初始位置的迭代器
Mat_::iterator itend=outputImage.end();//终止位置的迭代器
//存储彩色图像的像素
for(;it !=itend;it++){
(it)[0] = (it)[0]/divdiv+div/2; // B蓝色通道
(it)[1]=(it)[1]/divdiv+div/2; // G绿色通道
(it)[2]=(it)[2]/divdiv+div/2; //R红色通道
}
} //处理的速度慢,在三种遍历中的处理速度是最慢的。
//动态地址计算,动态地址运算配合at方法的colorReduce函数的代码
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(i,j)[0] = outputImage.at(i,j)[0]/div
div+div/2; //获取蓝色通道并进行相关运算
outputImage.at(i,j)[1]=outputImage.at(i,j)[1]/div
div+div/2; //获取绿色通道并进行相关运算
outputImage.at(i,j)[2]=outputImage.at(i,j)[2]/div
div+div/2; //获取红色通道并进行相关运算
}
}//遍历图像元素的方法有很多种可以进行封装起来直接调用
}
int main()
{
Mat img1=imread(“1.jpg”);
imshow(“原始图像”,img1);//以后要注意力在显示一幅图像要想长期悬挂的话一定要配上语句waitKey(0)
Mat dstImage;
dstImage.create(img1.rows,img1.cols,img1.type());
//效果图的大小,类型和原图片相同
double time0=static_cast(getTickCount());
// colorReduce(img1,dstImage,32);
colorReduce(img1,dstImage,32);
time0=((double)getTickCount()-time0)/getTickFrequency();
cout<<“对一幅图片的像素处理的时间为”<<endl<<time0<<endl<<“秒”<<endl;
imshow(“颜色空间缩减的图片”,dstImage); //很明显颜色空间缩减的图片与原图相比会有点失真的现象
waitKey(0);
}

以上三种对图像中像素点的访问算法的复杂度是不同的,所以,自己可以用opencv中带的时间来函数来计算一下,验证下哪种算法是最好的!!

成功的路上有CSDN陪伴不会孤独!

猜你喜欢

转载自blog.csdn.net/nbxuwentao/article/details/85802141