Opencv3学习笔记(4)之像素定位与颜色缩减

标签: 像素值定位

1、颜色缩减算法公式:

I_{new} =\left ( \frac{I_{new} }{10} \right )\times 10

注意I_{old}是uchar类型(0~255)的, 因为uchar除int型仍为uchar型,因此\frac{I_{new} }{10} 取得是余数。

2、灰度图像取像素点:Image.at(i,j)

彩色图像:1)蓝色通道 :Image.at<Vec3b>(i,j)[0]

                    2)   绿色通道 : Image.at<Vec3b>(i,j)[1]

                    3)   红色通道 : Image.at<Vec3b>(i,j)[2]

程序实例:

编程注意要点:1)全局函数声明之后,子函数的位置可随意,否则必须要放在主函数的前面。2)Vs里面双引号的应用要注意。

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
using namespace std;
using namespace cv;

// vs头文件定义要用双引号
void colorReduce(Mat &srcImage, Mat &dstImage, int div);

//全局函数声明之后,子函数的位置可随意,未声明必须在前面;
//主函数
int main()
{
	Mat srcImage = imread("E:/学习资料/VS2013程序/lena.jpg");
	imshow("原图像",srcImage);
	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("效果图",dstImage);
	waitKey();
}
/*
void colorReduce(Mat &inputImage, Mat &outImage, int div)
{
	inputImage.copyTo(outImage);
	int rowNumber = outImage.rows;
	int colNumber = outImage.cols*outImage.channels();
	for (int i = 0; i < rowNumber; i++)
	{
		uchar* data = outImage.ptr<uchar>(i);

		for (int j = 0; j <colNumber; j++)
		{
			data[j] = data[j] / div*div + div / 2;
		}
	}
}
*/
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 ;
			outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div*div ;
			outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div*div ;
		}
	}
}

图示: