方式一:通过指针获取图像的像素
- 获得图像的行数
- 使用ptr()函数,获得图像的行指针
- 获取图像的列数,这里需要注意一下,如果是多通道的图像,图像的列数需要乘以该图片的通道数
- 需要获得图像的列函数
- 对图像进行处理
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void colorReduce(Mat & inputImage, Mat & outputImage, int div);
int main(int argc, char ** argv) {
Mat srcImage = imread("1.jpg");
if (srcImage.empty()) {
printf("could not load this picture!\n");
return -1;
}
imshow("源代码", srcImage);
Mat dstImage;
dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());
colorReduce(srcImage, dstImage, 32);
waitKey(0);
return 0;
}
void colorReduce(Mat & inputImage, Mat & outputImage, int div) {
方法一:通过指针获取图像的像素
//outputImage = inputImage.clone();
//int rowNumbers = outputImage.rows;
//int colNumbers = outputImage.cols * outputImage.channels();
//for (size_t rows = 0; rows < rowNumbers; rows++) {
// uchar * data = outputImage.ptr<uchar>(rows);
// for (size_t cols = 0; cols < colNumbers; cols++) {
// data[cols] = data[cols] / div * div + div / 2;
// }
//}
//imshow("效果图", outputImage);
方法二:通过动态地址获取图像的像素
//outputImage = inputImage.clone();
//int rowNumbers = outputImage.rows;
//int colNumbers = outputImage.cols;
//for (size_t rows = 0; rows < rowNumbers; rows++) {
// for (size_t cols = 0; cols < colNumbers; cols++) {
// outputImage.at<Vec3b>(rows, cols)[0] = inputImage.at<Vec3b>(rows, cols)[0] / div * div + div / 2;
// outputImage.at<Vec3b>(rows, cols)[1] = inputImage.at<Vec3b>(rows, cols)[1] / div * div + div / 2;
// outputImage.at<Vec3b>(rows, cols)[2] = inputImage.at<Vec3b>(rows, cols)[2] / div * div + div / 2;
// }
//}
//方法三:通过迭代器获取图像的像素
outputImage = inputImage.clone();
Mat_<Vec3b> ::iterator it = outputImage.begin<Vec3b>();
Mat_<Vec3b> ::iterator itend = outputImage.end<Vec3b>();
for (; it != itend; it++) {
(*it)[0] = (*it)[0] / div * div + div / 2;
(*it)[1] = (*it)[1] / div * div + div / 2;
(*it)[2] = (*it)[2] / div * div + div / 2;
}
imshow("目标图像", outputImage);
}