Open CV 学习笔记:访问图像中像素的几种方法
2015-03-27 19:40
411 查看
1.利用.ptr 和 []的方法
2.利用Mat_ iteractor迭代器
3.利用动态地址计算配合at 的方法
4.利用.ptr 和 * ++ 以及模操作的方法
5.利用操作符重载
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void colorReduce1(Mat& inputImage,Mat& outputImage,int div){
outputImage = inputImage.clone();
int rows = inputImage.rows;
int cols = inputImage.cols*inputImage.channels();
for(int i = 0;i < rows;i++){
uchar *data = outputImage.ptr<uchar>(i);
for(int j = 0;j < cols;j++){
data[j] = data[j]/div*div + div/2;
}
}
}
void colorReduce2(Mat &inputImage,Mat &outputImage,int div){
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;
}
}
void colorReduce3(Mat &inputImage,Mat &outputImage,int div){
outputImage = inputImage.clone();
int rows = inputImage.rows;
int cols = inputImage.cols;
for(int i = 0;i < rows;i++){
for(int j = 0;j < cols;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;
}
}
}
void colorReduce4(Mat &inputImage,Mat &outputImage, int div) {
int nl= inputImage.rows;
int nc= inputImage.cols * inputImage.channels(); //每行元素的总元素数量
outputImage = inputImage.clone();
int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
//掩码值
uchar mask= 0xFF<<n;
for (int j=0; j<nl; j++) {
uchar* data= outputImage.ptr<uchar>(j);
for (int i=0; i<nc; i++) {
*data++= *data&mask + div/2;
}
}
}
void colorReduce5(Mat &inputImage,Mat &outputImage, int div){
outputImage = inputImage.clone();
int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
//掩码值
uchar mask= 0xFF<<n;
//进行色彩还原
outputImage=(outputImage&Scalar(mask,mask,mask))+Scalar(div/2,div/2,div/2);
}
int main(int argc,char **argv){
Mat img = imread("1.jpg");
imshow("原始图片",img);
Mat dst;
dst.create(img.size(),img.type());
//第1种方法
double time0 = static_cast<double>(getTickCount());
colorReduce1(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第1种方法的时间:"<<time0<<endl;
imshow("处理后的图片1",dst);
//第2种方法
time0 = static_cast<double>(getTickCount());
colorReduce2(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第2种方法的时间:"<<time0<<endl;
imshow("处理后的图片2",dst);
//第3种方法
time0 = static_cast<double>(getTickCount());
colorReduce3(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第3种方法的时间:"<<time0<<endl;
imshow("处理后的图片3",dst);
//第4种方法
time0 = static_cast<double>(getTickCount());
colorReduce4(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第4种方法的时间:"<<time0<<endl;
imshow("处理后的图片4",dst);
//第5种方法
time0 = static_cast<double>(getTickCount());
colorReduce5(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第5种方法的时间:"<<time0<<endl;
imshow("处理后的图片5",dst);
waitKey(0);
return 0;
}
运行结果:
2.利用Mat_ iteractor迭代器
3.利用动态地址计算配合at 的方法
4.利用.ptr 和 * ++ 以及模操作的方法
5.利用操作符重载
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void colorReduce1(Mat& inputImage,Mat& outputImage,int div){
outputImage = inputImage.clone();
int rows = inputImage.rows;
int cols = inputImage.cols*inputImage.channels();
for(int i = 0;i < rows;i++){
uchar *data = outputImage.ptr<uchar>(i);
for(int j = 0;j < cols;j++){
data[j] = data[j]/div*div + div/2;
}
}
}
void colorReduce2(Mat &inputImage,Mat &outputImage,int div){
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;
}
}
void colorReduce3(Mat &inputImage,Mat &outputImage,int div){
outputImage = inputImage.clone();
int rows = inputImage.rows;
int cols = inputImage.cols;
for(int i = 0;i < rows;i++){
for(int j = 0;j < cols;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;
}
}
}
void colorReduce4(Mat &inputImage,Mat &outputImage, int div) {
int nl= inputImage.rows;
int nc= inputImage.cols * inputImage.channels(); //每行元素的总元素数量
outputImage = inputImage.clone();
int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
//掩码值
uchar mask= 0xFF<<n;
for (int j=0; j<nl; j++) {
uchar* data= outputImage.ptr<uchar>(j);
for (int i=0; i<nc; i++) {
*data++= *data&mask + div/2;
}
}
}
void colorReduce5(Mat &inputImage,Mat &outputImage, int div){
outputImage = inputImage.clone();
int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));
//掩码值
uchar mask= 0xFF<<n;
//进行色彩还原
outputImage=(outputImage&Scalar(mask,mask,mask))+Scalar(div/2,div/2,div/2);
}
int main(int argc,char **argv){
Mat img = imread("1.jpg");
imshow("原始图片",img);
Mat dst;
dst.create(img.size(),img.type());
//第1种方法
double time0 = static_cast<double>(getTickCount());
colorReduce1(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第1种方法的时间:"<<time0<<endl;
imshow("处理后的图片1",dst);
//第2种方法
time0 = static_cast<double>(getTickCount());
colorReduce2(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第2种方法的时间:"<<time0<<endl;
imshow("处理后的图片2",dst);
//第3种方法
time0 = static_cast<double>(getTickCount());
colorReduce3(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第3种方法的时间:"<<time0<<endl;
imshow("处理后的图片3",dst);
//第4种方法
time0 = static_cast<double>(getTickCount());
colorReduce4(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第4种方法的时间:"<<time0<<endl;
imshow("处理后的图片4",dst);
//第5种方法
time0 = static_cast<double>(getTickCount());
colorReduce5(img,dst,64);
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"第5种方法的时间:"<<time0<<endl;
imshow("处理后的图片5",dst);
waitKey(0);
return 0;
}
运行结果:
相关文章推荐
- opencv学习笔记1::访问图像中像素的三类方法(用指针,迭代器,动态地址)代码及用时检测
- OPENCV学习笔记2-5_扫描图像并访问相邻像素
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
- opencv学习(十)颜色缩减 // 查表 // 计时 // 访问像素的三个方法(指针/STL迭代器(待详细了解)/动态地址)//历遍图像的14种方法
- 【Ope 4000 nCV学习笔记】十、访问图像像素
- opencv学习笔记(八)IplImage* 访问图像像素的值
- openCV学习笔记-三种访问像素的方法
- OpenCV(六) Opencv中 core 核心模块详解——访问图像像素的几种方法
- opencv学习笔记——访问图像中的像素
- opencv学习笔记(十四)——图像像素的访问
- OpenCv学习笔记(六)----图像空间缩减,OpenCv中的计时函数和OpenCv中操作图像单个像素点的方法
- Open CV学习记录(五)——离群点、访问图像像素、remap、resize
- OpenCV学习笔记九——访问图像中的像素
- OpenCV 2 学习笔记(5): 像素的访问:给图像加入椒盐噪声
- 【OpenCV学习笔记】【函数学习】二十(访问图像像素)
- 【小白笔记】PHP学习之路 (29) --图像处理、绘制像素、矩形、多边形
- Symbian学习笔记(5)——加载JPEG图像的方法
- Symbian学习笔记(5)——加载JPEG图像的方法
- opencv里常用的访问图像像素数据方法
- C# OpenCV学习笔记三之图像捕捉及其灰度转换方法