欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习《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;
}

上述方法效果一样,原图如下:

学习《OpenCV 2 计算机视觉编程手册》第二章---使用指针遍历图像案例

颜色减少后的效果图如下:

学习《OpenCV 2 计算机视觉编程手册》第二章---使用指针遍历图像案例