2011-03-13 156 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。