影象彩色空間互轉在影象處理中應用非常廣泛,而且很多演算法只對灰度圖有效;另外,相比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...