OpenCv畫素點獲取與修改

2021-08-02 21:39:26 字數 3303 閱讀 3627

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影象為例,每乙個...