Opencv3学习笔记(4)之像素定位与颜色缩减
程序员文章站
2022-07-07 13:38:54
...
1、颜色缩减算法公式:
注意是uchar类型(0~255)的, 因为uchar除int型仍为uchar型,因此 取得是余数。
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 ;
}
}
}
图示: