OpenCV 彩色空間互轉

2021-10-05 11:21:01 字數 3831 閱讀 7384

影象彩色空間互轉在影象處理中應用非常廣泛,而且很多演算法只對灰度圖有效;另外,相比rgb,其他顏色空間(比如hsv、hsi)更具可分離性和可操作性,所以很多影象演算法需要將影象從rgb轉為其他顏色空間,所以影象彩色互轉是十分重要和關鍵的。

rgb顏色空間 基於顏色的加法混色原理,從黑色不斷疊加red,green,blue的顏色,最終可以得到白色。

將r、g、b三個通道作為笛卡爾座標系中的x、y、z軸,就得到了一種對於顏色的空間描述

對於彩色圖轉灰度圖,有乙個很著名的心理學公式:

gray = r * 0.299 + g * 0.587 + b * 0.114

2.顏色空間互轉理論的介紹

rgb與hsv互轉

hsv是一種將rgb色彩空間中的點在倒圓錐體中的表示方法。hsv即色相(hue)、飽和度(saturation)、明度(value),又稱hsb(b即brightness)。色相是色彩的基本屬性,就是平常說的顏色的名稱,如紅色、黃色等。飽和度(s)是指色彩的純度,越高色彩越純,低則逐漸變灰,取0-100%的數值。明度(v),取0-max(計算機中hsv取值範圍和儲存的長度有關)。hsv顏色空間可以用乙個圓錐空間模型來描述。圓錐的頂點處,v=0,h和s無定義,代表黑色。圓錐的頂面中心處v=max,s=0,h無定義,代表白色。

rgb顏色空間中,三種顏色分量的取值與所生成的顏色之間的聯絡並不直觀。而hsv顏色空間,更類似於人類感覺顏色的方式,封裝了關於顏色的資訊:「這是什麼顏色?深淺如何?明暗如何?

hsv模型

這個模型就是按色彩、深淺、明暗來描述的。

h是色彩;

s是深淺, s = 0時,只有灰度;

v是明暗,表示色彩的明亮程度,但與光強無直接聯絡。

3.opencv**實踐

函式原型(c++)

void cvtcolor(inputarray src, outputarray dst, int code, int dstcn=0)

dstcn: 目標影象的通道數,該引數為0時,目標影象根據源影象的通道數和具體操作自動決定

實現示例(c++)

#include #include #include // main

int main( int argc, char** ar** )

高階實現(根據原理自己實現)
#include #include #include #include cv::mat rgb2gray(cv::mat src, bool accelerate=false)

else}}

return dst;}

int main()

cv::mat dst,dst1;

//opencv自帶

double t2 = (double)cv::gettickcount(); //測時間

cv::cvtcolor(src, dst1, cv_rgb2gray);

t2 = (double)cv::gettickcount() - t2;

double time2 = (t2 *1000.) / ((double)cv::gettickfrequency());

std::cout << "opencv_rgb2gray=" << time2 << " ms. " << std::endl << std::endl;

//rgb2gray

double t1 = (double)cv::gettickcount(); //測時間

dst = rgb2gray(src, true);

t1 = (double)cv::gettickcount() - t1;

double time1 = (t1 *1000.) / ((double)cv::gettickfrequency());

std::cout << "my_rgb2gray=" << time1 << " ms. " << std::endl << std::endl;

cv::namedwindow("src", cv_window_normal);

imshow("src", src);

cv::namedwindow("my_rgb2gray", cv_window_normal);

imshow("my_rgb2gray", dst);

cv::namedwindow("opencv_rgb2gray", cv_window_normal);

imshow("opencv_rgb2gray", dst1);

cv::waitkey(0);

return 0;

}

#include #include #include #include using namespace cv;  

mat rgb2hsv(mat src)

else

if (r == maxx)

else if (g == maxx)

else if (b==maxx)

else

h *= 60;

if (h < 0)

h += 360;

dst.at(i, j)[0] = h;

dst.at(i, j)[1] = s;

} }return dst;}

mat hsv2rgb(mat src)

else

}dst.at(i, j)[0] = int(b * 255);

dst.at(i, j)[1] = int(g * 255);

dst.at(i, j)[2] = int(r * 255);

} }return dst;}

int main()

cv::mat dst, dst1, dst2;

opencv自帶/

cv::cvtcolor(src, dst1, cv_rgb2hsv); //rgb2hsv

//rgb2hsv//

dst = rgb2hsv(src); //rgb2hsv

dst2 = hsv2rgb(dst); //hsv2bgr

cv::namedwindow("src", cv_window_normal);

imshow("src", src);

cv::namedwindow("my_rgb2hsv", cv_window_normal);

imshow("my_rgb2hsv", dst);

cv::namedwindow("my_hsv2rgb", cv_window_normal);

imshow("my_hsv2rgb", dst2);

cv::namedwindow("opencv_rgb2hsv", cv_window_normal);

imshow("opencv_rgb2hsv", dst1);

cv::waitkey(0);

return 0;

}

該部分主要講解彩色空間互轉,彩色空間互轉是傳統影象演算法的乙個關鍵技術,學習顏色轉換有助於我們理解影象的色域,從而為我們從事cv相關工程技術和科學研究提供一些基礎、靈感和思路。

關於datawhale

datawhale是乙個專注於資料科學與ai領域的開源組織,匯集了眾多領域院校和知名企業的優秀學習者,聚合了一群有開源精神和探索精神的團隊成員。datawhale以「for the learner,和學習者一起成長」為願景,鼓勵真實地展現自我、開放包容、互信互助、敢於試錯和勇於擔當。同時datawhale 用開源的理念去探索開源內容、開源學習和開源方案,賦能人才培養,助力人才成長,建立起人與人,人與知識,人與企業和人與未來的聯結。

OpenCV 彩色空間互轉

在rgb色彩空間,影象深度與色彩的對映關係主要有真彩色 偽彩色和調配色。真彩色是指在組成一幅彩色影象的每個畫素值中,有r,g,b三個基色分量,每個基色分量直接決定顯示裝置的基色強度,這樣產生的彩色稱為真彩色,是真實的原圖彩色。偽彩色影象的每個畫素值實際上是乙個索引值或 該 值作為色彩查詢表clut中...

Task03 彩色空間互轉

影象彩色空間互轉在影象處理中應用非常廣泛,而且很多演算法只對灰度圖有效 另外,相比rgb,其他顏色空間 比如hsv hsi 更具可分離性和可操作性,所以很多影象演算法需要將影象從rgb轉為其他顏色空間,所以影象彩色互轉是十分重要和關鍵的。1.相關顏色空間的原理介紹 2.顏色空間互轉理論的介紹 3.o...

遙感影像彩色空間變換

在影像處理系統中,彩色空間變換時乙個常見的基礎功能,雖然功能不是特別複雜,但是也遇到了一些問題,畢竟第一次做影象處理的工作。在此,先介紹影像的rgb模型和hsi模型之間的轉換。在hsi模型中,h hue 代表色調 純度 顏色 s saturation 代表飽和度 i intensity 代表亮度 r...