您的位置:首页 > 其它

通过减色运算来学习遍历图像像素值三种方法

2016-04-27 11:11 357 查看
#include "opencv2/opencv.hpp"
using namespace cv;
void colorReduce0(Mat &src,Mat &dst,int div);
void colorReduce1(Mat &src,Mat &dst,int div);
void colorReduce2(Mat &src,Mat &dst,int div);
void main()
{
Mat SrcImg=imread("C:\\Users\\Administrator\\Desktop\\工作\\testp\\02.jpg");
Mat DstImg;
DstImg.create(SrcImg.rows,SrcImg.cols,SrcImg.type());

colorReduce2(SrcImg,DstImg,32);

imshow("src",SrcImg);
imshow("dst",DstImg);
waitKey(0);

}

void colorReduce0(Mat &src,Mat &dst,int div)
{
int row=src.rows;
int colsNum=src.cols*src.channels(); //这里能处理单通道或者多通道

for(int i=0;i<row;i++)
{
uchar *Srcdata=src.ptr<uchar>(i);  //一开始写成src.ptr<uchar>[i];
uchar *Dstdata=dst.ptr<uchar>(i);
for (int j=0;j<colsNum;j++)
{
Dstdata[j]=Srcdata[j]/div*div+div/2;
}
}

}
void colorReduce1(Mat &src,Mat &dst,int div)
{
Mat_<Vec3b>::iterator it=src.begin<Vec3b>();
Mat_<Vec3b>::iterator itend=src.end<Vec3b>();
Mat_<Vec3b>::iterator it_dst=dst.begin<Vec3b>();
for(;it!=itend;it++)
{
(*it_dst)[0]=(*it)[0]/div*div+div/2;
(*it_dst)[1]=(*it)[1]/div*div+div/2;
(*it_dst)[2]=(*it)[2]/div*div+div/2;
it_dst++;
}

}

void colorReduce2(Mat &src,Mat&dst,int div)
{
int rowNum=src.rows;
int colNum=src.cols;
for(int i=0;i<rowNum;i++)
for (int j=0;j<colNum;j++)  //注意at是at(int y,int x);
{
dst.at<Vec3b>(i,j)[0]=src.at<Vec3b>(i,j)[0]/div*div+div/2;
dst.at<Vec3b>(i,j)[1]=src.at<Vec3b>(i,j)[1]/div*div+div/2;
dst.at<Vec3b>(i,j)[2]=src.at<Vec3b>(i,j)[2]/div*div+div/2;

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