您的位置:首页 > 理论基础

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


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



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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: