【OpenCV】访问Mat图像中每个像素的值

今天百度搜资料还搜到了自己的。。。《访问图像中每个像素的值》,这是之前写的了,用的也是2.0的风格IplImage*格式,不太适用后来Mat的格式,特此重写一篇。

以下例子源自《The OpenCV Tutorials --Release 2.4.2》2.2 How to scan images, lookup tables and time measurement with OpenCV


图像容器Mat

还是先看Mat的存储形式。Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放 <uchar>类型;如果是RGB彩色图,存放 <Vec3b>类型。
单通道灰度图数据存放格式:

多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:

注意通道的顺序反转了:BGR。通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便。可以用  isContinuous()函数来判断图像数组是否为连续的。

访问图像中的像素


高效的方法:C操作符[ ]

最快的是直接用C风格的内存访问操作符[]来访问:
Mat& ScanImageAndReduceC(Mat& I, const uchar* const table)
{
	// accept only char type matrices
	CV_Assert(I.depth()
  • 67
    点赞
  • 230
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
### 回答1: 要输出MATLAB数据每个像素,可以使用MATLAB编程语言。首先,需要读取MAT文件并获取图像变量的。然后,根据图像变量的维度,可以使用循环来遍历每个像素并输出其。 假设MAT文件图像变量名为img,并且它是一个二维矩阵。 ``` % 读取MAT文件 load('file.mat'); % 获取图像变量的尺寸 [height, width] = size(img); % 遍历每个像素,并输出其 for i = 1:height for j = 1:width pixelValue = img(i, j); disp(['Pixel at (' num2str(i) ',' num2str(j) ') = ' num2str(pixelValue)]); end end ``` 以上代码假定MAT文件已经加载到MATLAB工作区,并且图像变量名为img。通过使用两个嵌套的循环,代码遍历了图像每个像素,并使用disp函数输出了每个像素。 请注意,以上的代码适用于二维矩阵,如果图像是多维的,需要根据图像的维度进行相应的修改。这个例子仅仅是一个简单的示例来回答问题,实际应用可能需要根据具体需求进行更多的处理。 ### 回答2: 要输出mat数据的每一个像素,首先需要确认mat是一个什么类型的数据结构。在OpenCVmat是一个多维数组,存储像素的类型可以是单通道或多通道的。这里以单通道的情况为例。 在输出像素之前,首先要确定mat的尺寸大小(宽度和高度),以确定需要遍历的像素数。可以通过mat.rows和mat.cols来获取。 然后,可以使用双重循环来遍历mat的每一个像素。外层循环控制行数,内层循环控制列数。 在循环,可以使用mat.at<数据类型>(行索引, 列索引)来获取对应位置的像素。例如,若mat是一个CV_8UC1类型的mat,表示像素范围为0-255的灰度图像,则可以使用mat.at<uchar>(i, j)来获取(i, j)位置的像素。 在循环输出每一个像素,可以使用cout或者其他适合的输出方式,将像素打印出来。 下面是一个简单的示例代码: ```cpp #include <iostream> #include <opencv2/opencv.hpp> int main() { cv::Mat mat = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像 int rows = mat.rows; int cols = mat.cols; for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { uchar pixel_value = mat.at<uchar>(i, j); std::cout << "Pixel value at (" << i << ", " << j << "): " << static_cast<int>(pixel_value) << std::endl; } } return 0; } ``` 上述代码使用OpenCV库读取一个灰度图像,并输出每一个像素。在实际应用,需要根据具体的需求对代码进行修改和优化。 ### 回答3: 要输出MATLAB的二维矩阵数据mat的每一个像素,首先我们需要将该二维矩阵转化为MATLAB图像矩阵。接下来,我们可以使用MATLAB的循环结构来遍历图像矩阵的每一个像素,并输出其。 具体步骤如下: 1. 首先,将MATLAB的二维矩阵mat转化为图像矩阵,可以使用im2uint8()函数将其转化为8位整型矩阵。 img = im2uint8(mat); 2. 然后,获取图像矩阵的行数和列数,以便遍历每个像素。 [rows, cols] = size(img); 3. 使用两个嵌套的循环结构来遍历图像矩阵的每一个像素,并输出其。 for i = 1:rows for j = 1:cols pixel_value = img(i, j); disp(['Pixel at position (', num2str(i), ',', num2str(j), ') has value: ', num2str(pixel_value)]); end end 通过以上步骤,我们可以逐个输出矩阵mat每个像素。代码,我们使用disp()函数将输出结果显示在命令行窗口,并使用num2str()函数将数转化为字符串以输出。最后的输出结果将包括每个像素的位置和相应的像素。 需要注意的是,上述代码是在MATLAB环境运行的,如果您需要在其他编程环境实现类似的功能,可以根据具体的编程语言语法进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值