OpenCV 读取图像并使用整数值管理它们的像素(如 matlab)

Posted

技术标签:

【中文标题】OpenCV 读取图像并使用整数值管理它们的像素(如 matlab)【英文标题】:OpenCV read image and manage their pixel with integer values (like matlab) 【发布时间】:2011-03-13 23:52:01 【问题描述】:

在 matlab 中,当我使用 imread 函数时,图像的像素值存储在 3D 矩阵(uint8)中。矩阵的值介于 0 和 255 之间。但在 OpenCV 中,imread 函数将值存储在 cv::Mat 中。当我尝试查看像素值时,我看到的是浮点值,当我尝试转换为整数时,我的值很大。

我怎样才能像在 Matlab 中那样查看值在 0 到 255 之间的 cv::Mat 分量 (RGB)?

提前致谢!

【问题讨论】:

【参考方案1】:

cv::Mat 可以与任何类型的像素一起使用,如果您使用 imread 它将创建一个正确类型的 cv::Mat。

浮点图像不常见 - 您确定源数据是浮点数还是只是打印错误的值?

您可以使用 cvtcolor() 将浮点图像转换为 8 位 (CV8UC3)

【讨论】:

我怀疑他打印的值是错误的。 @msdark:要访问y 行和x 列像素的蓝色分量,您需要使用unsigned char b = mat.at<cv::Vec3b>(y, x)[0] 之类的东西(图像在opencv 中按BGR 顺序加载)。 例如,我有一个灰度图像,我尝试使用 Vec3b、Vec2i 和 Vec2f 和 .. 使用 Vec3b 我看到像 (v,z) .. 对于 Vec2i (2020038511,1632856665) 和 Vec2f 的值Vec2i 的浮动版本。【参考方案2】:
int red = (int)((uchar*)pImg->imageData)[y*((int)pImg->widthStep)+x*3+C];

这些是给IplImage的。不知道是否适用于Mat。 C=(0 or 1 or 2) 用于颜色通道。

【讨论】:

【参考方案3】:

结果示例

我有这个:

Canny(test,edges,0.9*av[0],2*av[0],3,true);
    for(int i=0;i<edges.rows;i++)
        for(int j=0;j<edges.cols;j++)
            cv::Vec2w& elem = edges.at<cv::Vec2w>(i,j);
            std::cout << elem[0] << " , "<<elem[1] << std::endl;
        
    

边缘 (cv::Mat) 变量存储 cv::Canny 函数的结果(二进制图像).. 当我尝试使用 cv::Vec2w 查看像素值时,结果如下: 6408 , 2058 1817 , 7433 1540 , 282 5386 , 1024 15 , 4867 768 , 275 1285 , 512 2 , 0 0 , 0 1 , 256 与 cv::Vec2

0 , 0 0 , 0 0 , 0 0 , 0 0 , -256 255 , -256 0 , 0 0 , 0

使用 cv::Vec2i

0 , 0 0 , 0 -16777216 , -16776961 0 , 0 0 , -256 -1 , 65535 0 , -16777216 65535 , 0 0 , 0

等等……

但是例如,如果我写这个图像 (imwrite("image.pgm",edges) ) 然后用armadillo 读取(图像是单通道二进制图像),我有一个矩阵 (nx1)值在 0 到 255 之间 .. 我知道 .. 两个库的格式不同,但是 .. 我假设:二进制图像在一个通道中始终具有值 0 和 255 ....

【讨论】:

【参考方案4】:

我通常将图像存储在 IplImage* 类型而不是 cv::Mat 中。如果我说IplImage* frame = (get image somehow...),那么我可以说frame-&gt;imageData 来查看您感兴趣的值。这些值是针对单个数组[r1, b1, g1, r2, b2, g2, r3, b3, g3, ..., r(height*width), b(height*width), g(height*width)] 中的RGB 图像排列的,我相信它们是按行排列的。

【讨论】:

cv::Mat 与 iplimage 的格式相同,像素颜色的顺序没有被定义——它取决于它们被读取的源。许多相机会产生 BGR,尤其是在 windows 上【参考方案5】:

您需要的是edges.at&lt;cv::Vec2b&gt;(i,j),而不是 cv::Vec2w 或 cv::Vec2i。

【讨论】:

以上是关于OpenCV 读取图像并使用整数值管理它们的像素(如 matlab)的主要内容,如果未能解决你的问题,请参考以下文章

opencv标定板像素尺寸

OpenCV比较两个图像并获得不同的像素

opencv如何读取多边形区域内的像素值?

详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示

Opencv读取图片像素值并保存为txt文件

opencv之python版图像的读取显示保存像素遍历以及结合matplotlib使用