2011-03-13 153 views
1

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

如何在Matlab中看到值为0到255的cv::Mat组件(RGB)?

在此先感谢!

回答

1

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

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

可以浮点图像转换成8位(CV8UC3)与cvtcolor()

+1

我怀疑他打印错误的值。 @msdark:要访问像素在行'y'和列'x'的蓝色分量,你想使用类似'unsigned char b = mat.at (y,x)[0]'(图像加载按照opencv中的BGR顺序)。 – etarion 2011-03-14 07:16:11

+0

例如我有一个灰度图像,我尝试与Vec3b,Vec2i和Vec2f和..与Vec3b我看到像(v,z)..的值为Vec2i(2020038511,1632856665)和Vec2f的Vec2i的浮动版本。 – matiasfh 2011-03-15 23:08:13

0

我通常存储在IplImage*类型而不是cv::Mat图像。如果我说IplImage* frame = (get image somehow...),那么我可以说frame->imageData看到你感兴趣的值。这些值被排列为一个单一阵列的RGB图像[r1, b1, g1, r2, b2, g2, r3, b3, g3, ..., r(height*width), b(height*width), g(height*width)],我相信它们是按行排列的。

+1

cv :: Mat与iplimage的格式相同,像素颜色的顺序不受限制 - 取决于它们从中读取的来源。许多相机将生成BGR,特别是在Windows – 2011-03-15 05:53:42

+0

...和Mac上:) – 2012-11-23 03:47:27

0

结果

的一个例子我有此:

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的结果::坎尼函数(二进制图像)..当我尝试看到使用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”,边缘)),然后阅读armadillo(图像是一个单通道的二进制图像)我有一个矩阵(nx1)的值在0和255之间..我知道..这两个库的格式是不同的,但..我supose:二进制图像在一个通道中始终有值0和255 ....

1
int red = (int)((uchar*)pImg->imageData)[y*((int)pImg->widthStep)+x*3+C]; 

这些是针对IplImage。不知道是否适用于Mat。 C=(0 or 1 or 2)用于彩色通道。

0

你需要的是edges.at<cv::Vec2b>(i,j),而不是cv :: Vec2w或cv :: Vec2i。