OpenCV遍历图像像素 您所在的位置:网站首页 opencv图像遍历 OpenCV遍历图像像素

OpenCV遍历图像像素

2024-01-16 15:57| 来源: 网络整理| 查看: 265

引言:

为了构建计算机视觉应用程序,需要学会访问图像内容,有时也要修改或创建图像,如何操作图像的像素,就需要遍历一幅图像并处理每一个像素。现在我们就来介绍OpenCV三种图像像素的遍历方法。

一、 用cv::Mat类的at方法扫描图像

 利用cv::Mat的at(int x,int y)方法可以访问元素,其中x是行号,y是列号。在编译时必须明确方法返回值的类型,因为cv::Mat可以接受任何类型的元素,所以程序员需要指定返回值的预期类型。正因为如此,at方法被实现成一个模板方法。在调用at方法时,你必须指定图像元素的类型,例如:

// 单通道图像 image.at(i,j)= 255; // 三通道图像 image.at(i, j) = cv::Vec3b(255, 255, 255);

用cv::Mat类的at方法扫描图像代码如下:

void visit_mat_by_at(cv::Mat &img) { for (int i = 0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { // 单通道图像 if (img.channels() == 1) { img.at(i, j) += 50; } // 三通道图像 else { img.at(i, j)[0] += 50; img.at(i, j)[1] += 50; img.at(i, j)[2] += 50; } } } } 二、 用指针扫描图像

一般来说,用指针扫描图像比较高效。在大多数图像处理任务中,执行计算时你都需要对图像的所有像素进行扫描。需要访问的像素数量非常庞大,因此你必须采用高效的方式来执行这个任务。

用指针扫描图像代码如下:

void visit_mat_by_pointer(cv::Mat &img) { for (int i = 0; i < img.rows; i++) { uchar *data = img.ptr(i); for (int j = 0; j < img.cols * img.channels(); j++) { data[j] += 50; } } } 三、 用迭代器扫描图像

在面向对象编程时,我们通常用迭代器对数据集合进行循环遍历。迭代器是一种类,专门用于遍历集合的每个元素,并能隐藏遍历过程的具体细节。标准模板库(Standard Template Library,STL)对每个集合类都定义了对应的迭代器类,OpenCV也提供了cv::Mat的迭代器类,并且与C++ STL中的标准迭代器兼容。

用迭代器扫描图像代码如下:

void visit_mat_by_iterator(cv::Mat &img) { // 单通道图像 if (img.channels() == 1) { cv::Mat_::iterator begin = img.begin(); cv::Mat_::iterator end = img.end(); for (auto it = begin; it != end; it++) { *it += 50; } } // 三通道图像 else { cv::Mat_::iterator begin = img.begin(); cv::Mat_::iterator end = img.end(); for (auto it = begin; it != end; it++) { (*it)[0] += 50; (*it)[1] += 50; (*it)[2] += 50; } } }

测试代码:

#include #include int main() { // 单通道图像 cv::Mat img1(3, 4, CV_8UC1, 100); std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有