OpenCV中,使用三种方式获得图像的像素

方式一:通过指针获取图像的像素

  1. 获得图像的行数
  2. 使用ptr()函数,获得图像的行指针
  3. 获取图像的列数,这里需要注意一下,如果是多通道的图像,图像的列数需要乘以该图片的通道数
  4. 需要获得图像的列函数
  5. 对图像进行处理
#include 
#include 

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(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(rows, cols)[0] = inputImage.at(rows, cols)[0] / div * div + div / 2;
	//		outputImage.at(rows, cols)[1] = inputImage.at(rows, cols)[1] / div * div + div / 2;
	//		outputImage.at(rows, cols)[2] = inputImage.at(rows, cols)[2] / div * div + div / 2;
	//	}
	//}

	//方法三:通过迭代器获取图像的像素
	outputImage = inputImage.clone();
	Mat_ ::iterator it = outputImage.begin();
	Mat_ ::iterator itend = outputImage.end();
	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);
}

 

你可能感兴趣的:(OpenCV,OpneCV)