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

                                            使用指针遍历图像案例:减少图像中颜色的数目

用户需要提供一个图像和缩减因子:

方法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;
}

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值