1. 程式人生 > >訪問影象畫素幾種方法

訪問影象畫素幾種方法

#include <iostream>
#include <opencv2/opencv.hpp>
#include <Windows.h>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;


/*
-------------------------動態地址運算
*/
void colorReduce(Mat &inputImage, Mat &outputImage, int div)
{
	outputImage = inputImage.clone();
	int rowNumber = outputImage.rows;
	int colNumber = outputImage.cols;

	for (int i = 0; i < rowNumber; ++i)
	{
		for (int j = 0; j < colNumber; ++j)
		{
			outputImage.at<Vec3b>(i, j)[0] = outputImage.at<Vec3b>(i, j)[0] / div * div + div / 2;
			outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div * div + div / 2;
			outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div * div + div / 2;
		}
	}
}


/*

-----迭代器訪問------------

void colorReduce(Mat &inputImage, Mat &outputImage, int div)
{
	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;
	}
}
*/

/*
-------用指標訪問元素----------

void colorReduce(Mat &inputImage, Mat &outputImage, int div)
{
	outputImage = inputImage.clone();
	int rowNumber = outputImage.rows;
	int colNumber = outputImage.cols*outputImage.channels();

	for (int i = 0; i < rowNumber; ++i)
	{
		uchar *data = outputImage.ptr<uchar>(i);
		for (int j = 0; j < colNumber; ++j)
		{
			data[j] = data[j] / div * div + div / 2;
		}
	}
}
*/
int main(int argc,char *argv[],char **env)
{

	Mat srcImage = imread("1.jpg");
	Mat dstImage;
	dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());
	double time0 = static_cast<double> (getTickCount());

	colorReduce(srcImage, dstImage, 32);


	time0 = ((double)getTickCount() - time0) / getTickFrequency();
	cout << time0 << endl;

	imshow("1", dstImage);

	waitKey(0);
	return 0;
}