学习《OpenCV 2 计算机视觉编程手册》第二章---使用指针遍历图像案例
2017-05-13 21:54
495 查看
使用指针遍历图像案例:减少图像中颜色的数目
用户需要提供一个图像和缩减因子:
方法1:
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\core\core.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//为降低复杂度,使用for循环遍历每一个像素,来处理减少图像的颜色数目
void ColorReduce(Mat &img,int div=64)
{
int rows=img.rows;//行数
int row_count=img.cols*img.channels();//每行的元素个数
for (int i = 0; i < rows; i++)
{
//得到每行的首地址
uchar* data=img.ptr<uchar>(i);
for (int j = 0; j <row_count; j++)
{
//对每行中的所有像素进行处理
data[j]=data[j]/div*div+div/2;
}
}
}
int main()
{
Mat img=imread("img/1.jpg",1);
namedWindow("1");
imshow("1",img);
ColorReduce(img);
namedWindow("2");
imshow("2",img);
waitKey();
return 0;
}
方法2:
使用迭代器iterator来循环像素,对颜色缩减操作,
迭代器iteratore有两种声明方式:
方式1:cv::Mat Iterator_<Vec3b> it;方式2:
cv::Mat_<Vec3b>::iterator it;代码如下:
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\core\core.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//使用迭代器来循环像素,对颜色缩减操作
void ColorReduce(Mat &img,int div=64)
{
//迭代器开始的位置
cv::Mat_<Vec3b>::iterator it=img.begin<Vec3b>();
//迭代器结束的位置
Mat_<Vec3b>::iterator itend=img.end<Vec3b>();
//用while循环遍历所有像素
while (it!=itend)
{
(*it)[0]=(*it)[0]/div*div+div/2;
(*it)[1]=(*it)[1]/div*div+div/2;
(*it)[2]=(*it)[2]/div*div+div/2;
++it;
}
}
int main()
{
Mat img=imread("img/1.jpg",1);
namedWindow("1");
imshow("1",img);
ColorReduce(img);
namedWindow("2");
imshow("2",img);
waitKey();
return 0;
}
上述方法效果一样,原图如下:
颜色减少后的效果图如下:
用户需要提供一个图像和缩减因子:
方法1:
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\core\core.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//为降低复杂度,使用for循环遍历每一个像素,来处理减少图像的颜色数目
void ColorReduce(Mat &img,int div=64)
{
int rows=img.rows;//行数
int row_count=img.cols*img.channels();//每行的元素个数
for (int i = 0; i < rows; i++)
{
//得到每行的首地址
uchar* data=img.ptr<uchar>(i);
for (int j = 0; j <row_count; j++)
{
//对每行中的所有像素进行处理
data[j]=data[j]/div*div+div/2;
}
}
}
int main()
{
Mat img=imread("img/1.jpg",1);
namedWindow("1");
imshow("1",img);
ColorReduce(img);
namedWindow("2");
imshow("2",img);
waitKey();
return 0;
}
方法2:
使用迭代器iterator来循环像素,对颜色缩减操作,
迭代器iteratore有两种声明方式:
方式1:cv::Mat Iterator_<Vec3b> it;方式2:
cv::Mat_<Vec3b>::iterator it;代码如下:
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\core\core.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//使用迭代器来循环像素,对颜色缩减操作
void ColorReduce(Mat &img,int div=64)
{
//迭代器开始的位置
cv::Mat_<Vec3b>::iterator it=img.begin<Vec3b>();
//迭代器结束的位置
Mat_<Vec3b>::iterator itend=img.end<Vec3b>();
//用while循环遍历所有像素
while (it!=itend)
{
(*it)[0]=(*it)[0]/div*div+div/2;
(*it)[1]=(*it)[1]/div*div+div/2;
(*it)[2]=(*it)[2]/div*div+div/2;
++it;
}
}
int main()
{
Mat img=imread("img/1.jpg",1);
namedWindow("1");
imshow("1",img);
ColorReduce(img);
namedWindow("2");
imshow("2",img);
waitKey();
return 0;
}
上述方法效果一样,原图如下:
颜色减少后的效果图如下:
相关文章推荐
- 学习《OpenCV 2 计算机视觉编程手册》第二章遍历图像和领域操作实例——对图像进行锐化
- 学习《OpenCV 2 计算机视觉编程手册》第二章存取像素值案例--椒盐噪声
- [OpenCv2 计算机视觉编程手册] 第六章 图像滤波
- 《Opencv 2计算机视觉编程手册 》学习笔记 1
- OPENCV学习笔记2-2_图像遍历(使用指针)
- OpenCV2计算机视觉应用编程手册(自学版)初级六
- 3_opencv2计算机视觉学习_基于类的图像处理
- 双目视觉学习笔记(一)--qtcreator下使用opencv读取并存储双摄像头图像
- OpenCV2计算机视觉应用编程手册(自学版)初级七
- OpenCV 2 学习笔记(6): 使用指针来扫描图像:减少图像的位深
- 无需复杂深度学习算法,基于计算机视觉使用Python和OpenCV计算道路交通
- OpenCV3计算机视觉Python语言实现(三):使用OpenCV3处理图像
- OpenCV2计算机视觉应用编程手册(自学版)初级一
- OpenCV学习之三:使用迭代器遍历图像
- 计算机视觉与图像处理学习笔记(二)win32+mingw+opencv搭建
- OpenCV2计算机视觉应用编程手册(自学版)初级四
- OpenCV学习篇之五 使用指针遍历图像
- [OpenCV2]使用指针遍历图像
- 《OpenCV2 计算机视觉编程手册》视频处理三
- opencv学习(5) 使用迭代器遍历图像的像素