1、matlab獲取彩色影象畫素值的方法
三通道排序分別對應彩色影象的rgb三通道
2、opencv中獲取影象畫素的方法
方法一:
}注意記憶體中儲存順序是bgr
方法二:
for (int i = 0; i < img->height; ++i)
假設灰度影象image,訪問其i行j列的象素可以這樣:cv_image_elem(image, uchar,y, x)
如果是彩色影象就是
cv_image_elem(image, uchar,y, 3*x)
cv_image_elem(image, uchar,y, 3*x+1)
cv_image_elem(image, uchar,y, 3*x+2)
cv_image_elem是乙個巨集,
#define cv_image_elem( image, elemtype, row, col ) \
(((elemtype*)((image)->imagedata + (image)->widthstep*(row)))[(col)])
#define cv_mat_elem( mat, elemtype, row, col ) \
(*(elemtype*)cv_mat_elem_ptr_fast( mat, row, col, sizeof(elemtype)))
呵呵,我一直把它當乙個函式用,其實本質也沒有什麼區別的
但要想正確的得到影象的座標為(x,y)點的畫素值,是應該這樣寫cv_image_elem(image, uchar, y, x)
要注意畫素點的座標xy和行列值的順序是相反的(可以仔細思考為什麼)
我剛開始一直寫成cv_image_elem(image, uchar, x, y),結果有時候就造成了訪問image越界,從而報錯,花了好長時間才搗鼓出來,
不過將image的資料按照原來的樣子複製到mat中可以這麼寫:
cv_image_elem(pimage, uchar, i, j) = cv_mat_elem(*mat, uchar, i, j)
不用改變順序
總之,當應用這個巨集是如果老報錯,就試試換個順序,或者檢查訪問的位址是否越界
方法三:
對於單通道位元組型影象:
iplimage* img=cvcreateimage(cvsize(
640,
480),ipl_depth_8u,1);
((uchar *)(img->imagedata + i*img->widthstep))[j]=
111;
對於多通道位元組型影象:
iplimage* img=cvcreateimage(cvsize(
640,
480),ipl_depth_8u,3);
((uchar *)(img->imagedata + i*img->widthstep))[j*img->nchannels +0]=
111;//b
((uchar *)(img->imagedata + i*img->widthstep))[j*img->nchannels +1]=
112;//g
((uchar *)(img->imagedata + i*img->widthstep))[j*img->nchannels +2]=
113;//r
對於多通道浮點型影象:
iplimage* img=cvcreateimage(cvsize(
640,
480),ipl_depth_32f,3);
((float
*)(img->imagedata + i*img->widthstep))[j*img->nchannels + 0]=
111;//b
((float
*)(img->imagedata + i*img->widthstep))[j*img->nchannels + 1]=
112;//g
((float
*)(img->imagedata + i*img->widthstep))[j*img->nchannels + 2]=
113;//r
3 ((uchar*)(img1->imagedata + img1->widthstep*pt.y))[pt.x]的具體含義:
(1)這裡img1->imagedata指的影象第一行的首位址,pt.y是指影象的height(影象高畫素數即行數),y乘以img->widthstep(排列的影象行大小)即首位址加上行數乘以每行總數,得到第y行的首位址。widthstep是指影象每行所佔的位元組數,主要要和
width
區別,width
是指每行所含的畫素個數,但是乙個畫素也可能佔乙個位元組,也可能佔三個位元組或者四個。
imagedata
是指向儲存影象畫素值陣列的指標,內容是這個陣列的首位址,
pt.y
指的是畫素點的行座標,所以
img->imagedata + img->widthstep*pt.y
便是該畫素點所在行的首位址,然後再加上該畫素點所在的列,即
pt.x
,就得到了該畫素點的位址,所以那句**也可以寫成
((uchar*)(img1->imagedata + img1->widthstep*pt.y+pt.x)),
都是指該畫素點的畫素值,至於強制型別轉換,是因為會產生一些負值,而畫素值是不能為負的。
(2)widthstep表示儲存一行畫素需要的位元組數。
widthstep必須是
4的倍數,如果
8u影象寬度為
3,那麼
widthstep是4
,加乙個位元組補齊。這個影象的一行需要
4個位元組,只使用前
3個,最後乙個空在那兒不用。也就是乙個寬3高
3的影象的
imagedata
資料大小為
4*3=12
位元組。如果
32f的影象,那麼
widthstep=width*4
。
openCV畫素點處理
獲得畫素點的值便可以更加靈活的進行影象處理,在opencv裡可以通過cvget2d 和cvset2d 兩個函式加上乙個cvscalar結構體做到。opencv中,cvscalar結構為 typedef struct cvscalar cvscalar 4個double型變數,演算法處理時不至於被強制...
OpenCV獲取與設定畫素點的值的幾個方法
title fn 1 使用 mat 中對矩陣元素的位址定位的知識 參考博文 opencv中對mat裡面depth,dims,channels,step,data,elemsize和資料位址計算的理解 code1只是演示了單通道的情況,對於多通道的例子,請看 code2 然後再看 code3。fn 2...
OpenCV訪問畫素點的灰度值
1.mat矩陣數值的儲存方式 這裡以指標的方式訪問影象素為例 1 單通道 定義乙個單通道影象 cv mat img 1 320,640,cv 8uc1,scalar 0 對於單通道m i,j 即為第i行j列的其灰度值 程式中表示為 img 1.ptr i j 2 多通道 這裡以rgb影象為例,每乙個...