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->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<cv::Vec2b>(i,j)
,而不是 cv::Vec2w 或 cv::Vec2i。
【讨论】:
以上是关于OpenCV 读取图像并使用整数值管理它们的像素(如 matlab)的主要内容,如果未能解决你的问题,请参考以下文章