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

/*******************************************
****	第四讲  使用指针的方式遍历图像	****
********************************************/

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值