【opencv学习笔记.1】操作像素画圆

任何图像处理算法,都是从操作每个像素开始的,刚接触Opencv,写的第一个小程序:分别用动态地址和指针操作像素画圆。

用的是VS2015搭opencv3.0

一.首先是用动态地址计算来操作像素,这种方法简洁明了,符合大家对像素的直观认识。

#include 

#include

#include

using namespace std;

using namespace cv;

void pcircle(Mat& inputImage,Mat& outputImage);

 

int main()

{

Mat srcImage(500, 500, CV_8UC3, Scalar(255, 255, 255));

imshow("原图", srcImage);

Mat dstImage;

double time0 = static_cast<double>(getTickCount());

pcircle(srcImage, dstImage);

time0 = ((double)getTickCount() - time0) / getTickFrequency();

cout << "此方法运行时间为:" << time0<< "秒" << endl;

imshow("效果图", dstImage);

waitKey(0);

}

void pcircle(Mat&inputImage,Mat& outputImage)

{

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++)

{

if (((i - 250)*(i - 250) + (j - 250)*(j - 250) <= 10000))

{

outputImage.at<Vec3b>(i, j)[0] = 0;

outputImage.at<Vec3b>(i, j)[1] = 0;

outputImage.at<Vec3b>(i, j)[2] = 0;

}

}

}

}

效果图如图

【opencv学习笔记.1】操作像素画圆_第1张图片【opencv学习笔记.1】操作像素画圆_第2张图片




需要注意的是,如果把if (((i - 250)*(i - 250) + (j - 250)*(j - 250) <= 10000))里的<=改成==,则图像变成变径为100的圆的部分点,如图。若要操作像素画连续空心圆,后续会修改程序尝试。暂时没有写出程序,也希望大家给出建议。

【opencv学习笔记.1】操作像素画圆_第3张图片

二.用指针访问像素的这种方法利用的是C语言中的操作符[ ]。这种方法最快。

#include 

#include

#include

#include 

using namespace std;

using namespace cv;

void pcircle(Mat& inputImage,Mat& outputImage);

 

int main()

{

Mat srcImage(500, 500, CV_8UC3, Scalar(255, 255, 255));

imshow("原图", srcImage);

Mat dstImage;

double time0 = static_cast<double>(getTickCount());

pcircle(srcImage, dstImage);

time0 = ((double)getTickCount() - time0) / getTickFrequency();

cout << "此方法运行时间为:" << time0<< "秒" << endl;

imshow("效果图", dstImage);

waitKey(0);

}

void pcircle(Mat&inputImage,Mat& outputImage)

{

outputImage = inputImage.clone();

int rowNumber = outputImage.rows;

int colNumber = outputImage.cols;

 

for (int i = 0; i < rowNumber; i++)

{

uchar*data = outputImage.ptr<uchar>(i);

for (int j = 0; j < colNumber; j++)

{

if (((i - 250)*(i - 250) + (j - 250)*(j - 250) <= 10000))

{

data[3 * j] = 0;

data[3 * j+1] = 0;

data[3 * j+2] = 255;

}

}

}

}

效果如下:

【opencv学习笔记.1】操作像素画圆_第4张图片【opencv学习笔记.1】操作像素画圆_第5张图片

 

比较两种方法,用指针用时为0.00204492秒,动态地址方法用时为0.022096秒,用指针显然更快。

另,此程序用到的函数有:计时函数--getTickCount()和getTickFrequency();

用法见图中程序。

你可能感兴趣的:(图像处理)