【OpenCV C++学习】1、Mat像素操作(ptr指针遍历)

自学OpenCV的一点小笔记

还有其他遍历Mat的方法,比如使用at遍历,本篇只记录常用的指针遍历

1、单通道灰度图像

1.1 方法一(效率较低)

for (int i = 0; i < img.rows; i++)
	for (int j = 0; j < img.cols; j++)
    {
        uchar* p = img.ptr<uchar>(i, j);
        //操作像素
        //int value = p[0];
        //。。。。。。
    }

1.2 方法二

for (int i = 0; i < img.rows; i++)
{
    uchar* p = img.ptr<uchar>(i);
	for (int j = 0; j < img.cols; j++)
    {
		//操作像素
        //int value = p[j];
        //。。。。。。
    }
}

2、多通道图像

2.1 方法一

for(int i = 0;i<img.rows;i++)
	for (int j = 0; j < img.cols; j++)
    {
		uchar* p = img.ptr<uchar>(i, j);
        //操作像素
        //int B_value = p[0];
        //int G_value = p[1];
        //int R_value = p[2];
        //。。。。。。
	}

2.2 方法二

for (int i = 0; i < img.rows; i++)
{
    uchar* p = img.ptr<uchar>(i);
    for (int j = 0; j < img.cols*3; j+=3)
    {
        //操作像素
        //int B_value = p[j];
        //int G_value = p[j+1];
        //int R_value = p[j+2];
        //。。。。。。
    }
}

参考博客:

Mat.ptr进行像素操作_无情的搬砖机器的博客-优快云博客_mat.ptr

Opencv之三通道图像的三种指针遍历_努力|奋斗的博客-优快云博客_opencv 指针遍历

### 如何使用C++OpenCV遍历图像像素点 在处理图像时,经常需要逐个访问图像中的像素。以下是几种常见的方法来实现这一目标。 #### 方法一:使用迭代器 OpenCV 提供了一种方便的方式来遍历图像数据——`Mat_` 和 `at<T>()` 函数[^2]。这种方法允许开发者高效地访问矩阵中的每一个元素。 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("example.jpg", IMREAD_GRAYSCALE); if (image.empty()) { std::cout << "Image not found or unable to load!" << std::endl; return -1; } for(int i = 0; i < image.rows; ++i){ uchar* rowPtr = image.ptr<uchar>(i); // 获取第i行的指针 for(int j = 0; j < image.cols; ++j){ uchar pixelValue = rowPtr[j]; // 访问(i,j)位置的像素值 // 对像素进行操作... } } return 0; } ``` 此代码片段展示了如何通过获取每一行的指针并逐一读取列上的像素值来遍历灰度图像的所有像素。 #### 方法二:利用双重循环直接索引 另一种方式是采用传统的双层嵌套for-loop结构配合 `.at()` 成员函数完成同样的任务: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main(){ Mat img = imread("test.png"); if(img.empty()){ cout<<"Error loading image"<<endl; return -1; } for(int y=0;y<img.rows;++y){ for(int x=0;x<img.cols;++x){ Vec3b intensity = img.at<Vec3b>(Point(x,y)); // 处理BGR三个通道的数据 uchar blue = intensity.val[0]; uchar green = intensity.val[1]; uchar red = intensity.val[2]; // 修改颜色或其他操作 } } imwrite("output_image.png",img); return 0; } ``` 上述例子适用于彩色图片(BGR),其中每个像素由三部分组成分别代表蓝色、绿色以及红色强度。 #### 性能考虑 当涉及到大规模或者实时性的应用场景下,应优先选用更高效的算法和技术手段优化性能表现。例如,在某些情况下可以直接操作连续内存块而非单独寻址各个单元格;另外也可以借助SIMD指令集加速计算过程等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值