您的位置:首页 > 其它

使用指针的方式遍历图像数据

2015-11-30 22:08 148 查看
/*******************************************
****	第四讲  使用指针的方式遍历图像	****
********************************************/

#include "cv.h"
#include "highgui.h"
#include <time.h>

using namespace cv;
using namespace std;

/***	遍历图像的每一个像素并将图像设置为白色	***/
void setAllWhite(Mat& image)
{
int x, y;
/*********	第一种方式	************/
//for (y = 0; y < image.rows; y++)
//{
//	uchar* data = image.ptr<uchar>(y);//获取图像数据的指针,image有一个模板类
//										//参数y说明,取的是图像的行指针
//										//此时的data指向的是图像数据的第一行
//	for (x = 0; x < image.cols; x++)
//	{
//		data[0] = 255;				//由于对于三通道图像,每个像素有三个灰度值
//		data[1] = 255;				//因此在这里是分别对各个像素值的三通道灰度值
//		data[2] = 255;				//分别设定为白色

//		data = data + 3;			//完成一个像素值设定之后,要进行该行的下一个
//								//灰度值的设定的话指针需要调到下一个像素的开始位置
//								//此时指针需要偏置3个位置。
//	}
//}

/*********	第二种方式	***************/
//int rowLength = image.cols*image.channels();
//for (y = 0; y < image.rows; y++)
//{
//	uchar* data = image.ptr<uchar>(y);//获取图像数据的指针,image有一个模板类
//									//参数y说明,取的是图像的行指针
//									//此时的data指向的是图像数据的第一行
//	for (x = 0; x < rowLength; x++)
//	{
//		data[0] = 255;				//由于对于三通道图像,每个像素有三个灰度值
//	//	data[1] = 255;				//因此在这里是分别对各个像素值的三通道灰度值
//	//	data[2] = 255;				//分别设定为白色
//		data++;			//完成一个像素值设定之后,要进行该行的下一个
//									//灰度值的设定的话指针需要调到下一个像素的开始位置
//									//此时指针需要偏置3个位置。
//	//	*data++=255;	//两种方式都可以
//	}
//}

/********	第三种方式 单层循环遍历图像数据	*********/
//注意能使用单层循环的原因,其本质还是图像数据在内存中的存储方式
//一般情况,图像数据在内存中都是连续存储的,但有时候行与行之间会
//有一些预留空间,这样在存储图像数据时,行与行之间的内存地址就
//不是连续的(在内存是否连续存储可以用isContinuous()来判断)。单层循环效率更高
//int x;
int length = image.cols*image.channels()*image.rows;

uchar* data = image.ptr<uchar>(0);

for (x = 0; x < length; x++)
{
data[x] = 255;
}
}

int main(int argc, char** argv)
{
Mat src;
src = imread("G:/Learning/Machine_version/Photo/1.png");
namedWindow("SRC");
setAllWhite(src);
imshow("SRC", src);
waitKey(0);

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: