#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;
}
}
通过减色运算来学习遍历图像像素值三种方法
最新推荐文章于 2021-02-01 11:16:41 发布