使用Opencv獲取每個畫素點的RGB顏色分量/HSV顏色分量
阿新 • • 發佈:2019-01-24
一. 所需結構體
CvScalar
結構體介紹
typedef struct CvScalar
{
double val[4]; //BGRA
}CvScalar;
二. 所需函式cvGet2D
函式功能:獲取畫素點上的RGB顏色分量,如果是灰度圖直接返回灰度圖顏色分量
函式原型:
CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
引數介紹:const CvArr* arr: 要獲取畫素點顏色分量的影象指標
int idx0: 對應第幾行
int idx1: 對應第幾列
返回值:將獲取到的畫素點值以BGR的順序返回到CvScalar結構體的val元素中,如果是灰度圖那麼val第一個元素就是灰度圖的顏色分量三. 開始編寫程式碼
實驗圖:
jpg格式
3.1 開啟一張圖片
//載入影象到記憶體
IplImage *image = cvLoadImage("D:\\1.jpg");
if (image == NULL){ //open image error
printf("開啟影象檔案失敗!");
return -1;
}
獲取畫素點顏色RGB顏色分量
CvScalar scalar; //scalar for (int i = 0; i <= image->height-1; ++i){ for (int j = 0; j <= image->width-1; ++j){ scalar = cvGet2D(image,i,j); //獲取畫素點的RGB顏色分量 printf("第%d個畫素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]); getchar(); //防止列印速度太快,暫停一次列印一次 } }
執行結果:
完整程式碼:
HSV通道://載入影象到記憶體 IplImage *image = cvLoadImage("D:\\1.jpg"); if (image == NULL){ //open image error printf("開啟影象檔案失敗!"); return -1; } CvScalar scalar; //scalar for (int i = 0; i <= image->height-1; ++i){ for (int j = 0; j <= image->width-1; ++j){ scalar = cvGet2D(image,i,j); //獲取畫素點的RGB顏色分量 printf("第%d個畫素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]); getchar(); //防止列印速度太快,暫停一次列印一次 } }
需要cvCvtColor函式,我們只需要複用一下上面的程式碼即可
注意HSV顏色空間沒有順序問題,而RGB顏色空間Opencv使用的是BGR!
//載入影象到記憶體
IplImage *image = cvLoadImage("D:\\1.jpg");
if (image == NULL){ //open image error
printf("開啟影象檔案失敗!");
return -1;
}
IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels); //注意影象必須和輸入影象的size,顏色位深度,通道一致
cvZero(image1); //清空image_data資料
cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV
CvScalar scalar; //scalar
for (int i = 0; i <= image1->height-1; ++i){ //HSV
for (int j = 0; j <= image1->width-1; ++j){
scalar = cvGet2D(image1, i, j); //獲取畫素點的RGB顏色分量
printf("第%d個畫素的H:%d°,S:%lf,V:%lf\n", (i*image->width) + j, (int)scalar.val[0]*2, scalar.val[1]/255, scalar.val[2]/255);
getchar(); //防止列印速度太快,暫停一次列印一次
}
}
執行結果: