学习《OpenCV 2 计算机视觉编程手册》第二章---使用指针遍历图像案例
程序员文章站
2022-06-15 17:21:26
...
使用指针遍历图像案例:减少图像中颜色的数目
用户需要提供一个图像和缩减因子:
方法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;
}
上述方法效果一样,原图如下:
颜色减少后的效果图如下: