/*******************************************
**** 第四讲 使用指针的方式遍历图像 ****
********************************************/
#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;
}
使用指针的方式遍历图像数据
最新推荐文章于 2023-06-17 15:25:08 发布