Opencv提供了不同顏色模型之間轉(zhuǎn)換的函數(shù)cvtColor,可以很容易的將一種顏色模型轉(zhuǎn)換為另一種顏色模型。
原型
CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
功能:轉(zhuǎn)換一種顏色空間到另一種顏色空間。
在轉(zhuǎn)換RGB顏色空間的情況下,通道的順序應(yīng)該被明確指定 (RGB 或 BGR)。注意在 OpenCV 中缺省的顏色格式經(jīng)常被指定為RGB,但是實際上是BGR(字節(jié)順序顛倒),所以在一個標(biāo)準(zhǔn)的(24位)彩色圖像中第一個字節(jié)是一個8位的藍(lán)色部分,第二個字節(jié)是綠色部分,第三個字節(jié)是紅色部分,接著第四、第五、第六個字節(jié)將是第二個像素(藍(lán)色、綠色、紅色),一直這樣排下去。
The R, G, B 通道取值的常規(guī)范圍是:
-
CV_8U 圖像:0-255
-
CV_16U 圖像: 0-65535
-
CV_32F 圖像:0-1
在線性轉(zhuǎn)換的情況下,取值范圍沒有要求.但是在非線性轉(zhuǎn)換的情況下,一個輸入的RGB圖像為了能獲得正確的結(jié)果要歸一化到正確正確的取值范圍之內(nèi),例如RGB->LUV轉(zhuǎn)換.比如如果你有一個32位浮點數(shù)的圖像直接從一個8位的圖像轉(zhuǎn)換而來,沒有任何縮放。 那么它將具有0..255的值范圍而不是該函數(shù)假定的0..1。所以,在調(diào)用cvtColor之前,您需要先將圖像縮小:
img *= 1./255;
cvtColor(img, img, COLOR_BGR2Luv);
如果你用8位的圖像使用cvtColor,轉(zhuǎn)換將會丟失一些信息,對許多應(yīng)用來說,這并不是那么顯而易見,但是當(dāng)應(yīng)用需要足夠的顏色區(qū)間,或者在一個操作前轉(zhuǎn)換一個圖像然后再轉(zhuǎn)換回來,應(yīng)用被推薦使用32位的圖像。
如果轉(zhuǎn)換增加了alpha通道, 他的值將被設(shè)置為對應(yīng)通道值范圍的最大值:
-
CV_8U:255,
-
CV_16U:65535,
-
CV_32F:1.
參數(shù)釋義
-
參數(shù)1 src 輸入圖像: 8位無符號整型,16位無符號整型 ( CV_16UC... ), 或者單精度浮點數(shù)。
-
參數(shù)2 dst 輸出圖像,大小、深度和原圖像一致。
-
參數(shù)3 code 顏色空間轉(zhuǎn)換碼 (來自ColorConversionCodes).
-
參數(shù)4 dstCn 目標(biāo)圖像的通道數(shù); 如果參數(shù)是0,通道數(shù)自動由src和code決定.
參考函數(shù): imgproc_color_conversions
使用源碼
代碼功能是實現(xiàn)32位浮點數(shù)RGB圖像到HSV、YUV、GRAY、LAB的轉(zhuǎn)換。
#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
?
int main()
{cv::Mat img;img = cv::imread("F:/openCV/images/juice.jpg"); ? ? // 讀取圖像
?if (img.empty()) ? ?// 判斷是否讀取成功{std::cout << "導(dǎo)入圖像失敗!";std::cin.get(); ? ? // 讀取錯誤時,為了能在控制臺dos窗口看到輸出的信息,而不是一閃而過return -1;}else{std::cout << "導(dǎo)入圖像成功!"<<std::endl;}
?cv::Mat hsv;cv::Mat yuv;cv::Mat gray;cv::Mat lab;
?std::cout << "depth:" << img.depth()<<std::endl;
?cv::Mat img32;img.convertTo(img32, CV_32F, 1./255); ? ?// CV_8U轉(zhuǎn)換為CV_32Fstd::cout << "depth:" << img32.depth() << std::endl;
?cv::cvtColor(img32, hsv, cv::COLOR_RGB2HSV);cv::cvtColor(img32, yuv, cv::COLOR_RGB2YUV);cv::cvtColor(img32, gray, cv::COLOR_RGB2GRAY);cv::cvtColor(img32, lab, cv::COLOR_RGB2Lab);
?cv::imshow("原圖", img); ? ?// 顯示原圖圖像cv::imshow("hsv", hsv); ? ?// 顯示hsv圖像cv::imshow("yuv", yuv); ? ?// 顯示yuv圖像cv::imshow("gray", gray); ? ?// 顯示gray圖像cv::imshow("lab", lab); ? ?// 顯示gray圖像
?cv::waitKey(0); ? ?// 一直顯示圖像直到摁下任意鍵return 0;
}
運行結(jié)果如下圖所示:
附注:
/** the color conversion codes
@see @ref imgproc_color_conversions
@ingroup imgproc_color_conversions*/
enum ColorConversionCodes {COLOR_BGR2BGRA ? ? = 0, //!< 增加alpha通道到RGB或BGR圖像COLOR_RGB2RGBA ? ? = COLOR_BGR2BGRA,
?COLOR_BGRA2BGR ? ? = 1, //!< 從RGB或BGR圖像中刪除alpha通道COLOR_RGBA2RGB ? ? = COLOR_BGRA2BGR,
?COLOR_BGR2RGBA ? ? = 2, //!< 在RGB和BGR顏色空間之間轉(zhuǎn)換(有或者沒有alpha通道)COLOR_RGB2BGRA ? ? = COLOR_BGR2RGBA,
?COLOR_RGBA2BGR ? ? = 3,COLOR_BGRA2RGB ? ? = COLOR_RGBA2BGR,
?COLOR_BGR2RGB ? ? = 4,COLOR_RGB2BGR ? ? = COLOR_BGR2RGB,
?COLOR_BGRA2RGBA ? = 5,COLOR_RGBA2BGRA ? = COLOR_BGRA2RGBA,
?COLOR_BGR2GRAY ? ? = 6, //!< 在RGB/BGR和grayscale之間轉(zhuǎn)換, 參考 color_convert_rgb_gray "color conversions"COLOR_RGB2GRAY ? ? = 7,COLOR_GRAY2BGR ? ? = 8,COLOR_GRAY2RGB ? ? = COLOR_GRAY2BGR,COLOR_GRAY2BGRA ? = 9,COLOR_GRAY2RGBA ? = COLOR_GRAY2BGRA,COLOR_BGRA2GRAY ? = 10,COLOR_RGBA2GRAY ? = 11,
?COLOR_BGR2BGR565 ? = 12, //!< 在RGB/BGR和BGR565(16位圖像)之間轉(zhuǎn)換COLOR_RGB2BGR565 ? = 13,COLOR_BGR5652BGR ? = 14,COLOR_BGR5652RGB ? = 15,COLOR_BGRA2BGR565 = 16,COLOR_RGBA2BGR565 = 17,COLOR_BGR5652BGRA = 18,COLOR_BGR5652RGBA = 19,
?COLOR_GRAY2BGR565 = 20, //!< 從grayscale到BGR565 (16位圖像)轉(zhuǎn)換COLOR_BGR5652GRAY = 21,
?COLOR_BGR2BGR555 ? = 22, //!< 從RGB/BGR到BGR555(16位圖像)轉(zhuǎn)換COLOR_RGB2BGR555 ? = 23,COLOR_BGR5552BGR ? = 24,COLOR_BGR5552RGB ? = 25,COLOR_BGRA2BGR555 = 26,COLOR_RGBA2BGR555 = 27,COLOR_BGR5552BGRA = 28,COLOR_BGR5552RGBA = 29,
?COLOR_GRAY2BGR555 = 30, //!< 從grayscale到BGR555(16位圖像)轉(zhuǎn)換COLOR_BGR5552GRAY = 31,
?COLOR_BGR2XYZ ? ? = 32, //!< 從RGB/BGR到CIE XYZ, 參考 color_convert_rgb_xyz "color conversions"COLOR_RGB2XYZ ? ? = 33,COLOR_XYZ2BGR ? ? = 34,COLOR_XYZ2RGB ? ? = 35,
?COLOR_BGR2YCrCb ? = 36, //!< 從RGB/BGR 到luma-chroma (aka YCC),參考 color_convert_rgb_ycrcb "color conversions"COLOR_RGB2YCrCb ? = 37,COLOR_YCrCb2BGR ? = 38,COLOR_YCrCb2RGB ? = 39,
?COLOR_BGR2HSV ? ? = 40, //!< 從RGB/BGR到HSV (hue saturation value), 參考 color_convert_rgb_hsv "color conversions"COLOR_RGB2HSV ? ? = 41,
?COLOR_BGR2Lab ? ? = 44, //!< 轉(zhuǎn)換RGB/BGR到CIE Lab, 參考 color_convert_rgb_lab "color conversions"COLOR_RGB2Lab ? ? = 45,
?COLOR_BGR2Luv ? ? = 50, //!< 轉(zhuǎn)換RGB/BGR到CIE Luv, 參考color_convert_rgb_luv "color conversions"COLOR_RGB2Luv ? ? = 51,COLOR_BGR2HLS ? ? = 52, //!< 轉(zhuǎn)換RGB/BGR到HLS( 色度 亮度 飽和度),參考color_convert_rgb_hls "color conversions"COLOR_RGB2HLS ? ? = 53,
?COLOR_HSV2BGR ? ? = 54, //!< 反向轉(zhuǎn)換到 RGB/BGRCOLOR_HSV2RGB ? ? = 55,
?COLOR_Lab2BGR ? ? = 56,COLOR_Lab2RGB ? ? = 57,COLOR_Luv2BGR ? ? = 58,COLOR_Luv2RGB ? ? = 59,COLOR_HLS2BGR ? ? = 60,COLOR_HLS2RGB ? ? = 61,
?COLOR_BGR2HSV_FULL = 66,COLOR_RGB2HSV_FULL = 67,COLOR_BGR2HLS_FULL = 68,COLOR_RGB2HLS_FULL = 69,
?COLOR_HSV2BGR_FULL = 70,COLOR_HSV2RGB_FULL = 71,COLOR_HLS2BGR_FULL = 72,COLOR_HLS2RGB_FULL = 73,
?COLOR_LBGR2Lab ? ? = 74,COLOR_LRGB2Lab ? ? = 75,COLOR_LBGR2Luv ? ? = 76,COLOR_LRGB2Luv ? ? = 77,
?COLOR_Lab2LBGR ? ? = 78,COLOR_Lab2LRGB ? ? = 79,COLOR_Luv2LBGR ? ? = 80,COLOR_Luv2LRGB ? ? = 81,
?COLOR_BGR2YUV ? ? = 82, //!< RGB/BGR和YUV之間的轉(zhuǎn)換COLOR_RGB2YUV ? ? = 83,COLOR_YUV2BGR ? ? = 84,COLOR_YUV2RGB ? ? = 85,
?//! YUV 4:2:0 family to RGBCOLOR_YUV2RGB_NV12 = 90,COLOR_YUV2BGR_NV12 = 91,COLOR_YUV2RGB_NV21 = 92,COLOR_YUV2BGR_NV21 = 93,COLOR_YUV420sp2RGB = COLOR_YUV2RGB_NV21,COLOR_YUV420sp2BGR = COLOR_YUV2BGR_NV21,
?COLOR_YUV2RGBA_NV12 = 94,COLOR_YUV2BGRA_NV12 = 95,COLOR_YUV2RGBA_NV21 = 96,COLOR_YUV2BGRA_NV21 = 97,COLOR_YUV420sp2RGBA = COLOR_YUV2RGBA_NV21,COLOR_YUV420sp2BGRA = COLOR_YUV2BGRA_NV21,
?COLOR_YUV2RGB_YV12 = 98,COLOR_YUV2BGR_YV12 = 99,COLOR_YUV2RGB_IYUV = 100,COLOR_YUV2BGR_IYUV = 101,COLOR_YUV2RGB_I420 = COLOR_YUV2RGB_IYUV,COLOR_YUV2BGR_I420 = COLOR_YUV2BGR_IYUV,COLOR_YUV420p2RGB ? = COLOR_YUV2RGB_YV12,COLOR_YUV420p2BGR ? = COLOR_YUV2BGR_YV12,
?COLOR_YUV2RGBA_YV12 = 102,COLOR_YUV2BGRA_YV12 = 103,COLOR_YUV2RGBA_IYUV = 104,COLOR_YUV2BGRA_IYUV = 105,COLOR_YUV2RGBA_I420 = COLOR_YUV2RGBA_IYUV,COLOR_YUV2BGRA_I420 = COLOR_YUV2BGRA_IYUV,COLOR_YUV420p2RGBA = COLOR_YUV2RGBA_YV12,COLOR_YUV420p2BGRA = COLOR_YUV2BGRA_YV12,
?COLOR_YUV2GRAY_420 = 106,COLOR_YUV2GRAY_NV21 = COLOR_YUV2GRAY_420,COLOR_YUV2GRAY_NV12 = COLOR_YUV2GRAY_420,COLOR_YUV2GRAY_YV12 = COLOR_YUV2GRAY_420,COLOR_YUV2GRAY_IYUV = COLOR_YUV2GRAY_420,COLOR_YUV2GRAY_I420 = COLOR_YUV2GRAY_420,COLOR_YUV420sp2GRAY = COLOR_YUV2GRAY_420,COLOR_YUV420p2GRAY = COLOR_YUV2GRAY_420,
?//! YUV 4:2:2 family to RGBCOLOR_YUV2RGB_UYVY = 107,COLOR_YUV2BGR_UYVY = 108,//COLOR_YUV2RGB_VYUY = 109,//COLOR_YUV2BGR_VYUY = 110,COLOR_YUV2RGB_Y422 = COLOR_YUV2RGB_UYVY,COLOR_YUV2BGR_Y422 = COLOR_YUV2BGR_UYVY,COLOR_YUV2RGB_UYNV = COLOR_YUV2RGB_UYVY,COLOR_YUV2BGR_UYNV = COLOR_YUV2BGR_UYVY,
?COLOR_YUV2RGBA_UYVY = 111,COLOR_YUV2BGRA_UYVY = 112,//COLOR_YUV2RGBA_VYUY = 113,//COLOR_YUV2BGRA_VYUY = 114,COLOR_YUV2RGBA_Y422 = COLOR_YUV2RGBA_UYVY,COLOR_YUV2BGRA_Y422 = COLOR_YUV2BGRA_UYVY,COLOR_YUV2RGBA_UYNV = COLOR_YUV2RGBA_UYVY,COLOR_YUV2BGRA_UYNV = COLOR_YUV2BGRA_UYVY,
?COLOR_YUV2RGB_YUY2 = 115,COLOR_YUV2BGR_YUY2 = 116,COLOR_YUV2RGB_YVYU = 117,COLOR_YUV2BGR_YVYU = 118,COLOR_YUV2RGB_YUYV = COLOR_YUV2RGB_YUY2,COLOR_YUV2BGR_YUYV = COLOR_YUV2BGR_YUY2,COLOR_YUV2RGB_YUNV = COLOR_YUV2RGB_YUY2,COLOR_YUV2BGR_YUNV = COLOR_YUV2BGR_YUY2,
?COLOR_YUV2RGBA_YUY2 = 119,COLOR_YUV2BGRA_YUY2 = 120,COLOR_YUV2RGBA_YVYU = 121,COLOR_YUV2BGRA_YVYU = 122,COLOR_YUV2RGBA_YUYV = COLOR_YUV2RGBA_YUY2,COLOR_YUV2BGRA_YUYV = COLOR_YUV2BGRA_YUY2,COLOR_YUV2RGBA_YUNV = COLOR_YUV2RGBA_YUY2,COLOR_YUV2BGRA_YUNV = COLOR_YUV2BGRA_YUY2,
?COLOR_YUV2GRAY_UYVY = 123,COLOR_YUV2GRAY_YUY2 = 124,//CV_YUV2GRAY_VYUY ? = CV_YUV2GRAY_UYVY,COLOR_YUV2GRAY_Y422 = COLOR_YUV2GRAY_UYVY,COLOR_YUV2GRAY_UYNV = COLOR_YUV2GRAY_UYVY,COLOR_YUV2GRAY_YVYU = COLOR_YUV2GRAY_YUY2,COLOR_YUV2GRAY_YUYV = COLOR_YUV2GRAY_YUY2,COLOR_YUV2GRAY_YUNV = COLOR_YUV2GRAY_YUY2,
?//! alpha premultiplicationCOLOR_RGBA2mRGBA ? = 125,COLOR_mRGBA2RGBA ? = 126,
?//! RGB to YUV 4:2:0 familyCOLOR_RGB2YUV_I420 = 127,COLOR_BGR2YUV_I420 = 128,COLOR_RGB2YUV_IYUV = COLOR_RGB2YUV_I420,COLOR_BGR2YUV_IYUV = COLOR_BGR2YUV_I420,
?COLOR_RGBA2YUV_I420 = 129,COLOR_BGRA2YUV_I420 = 130,COLOR_RGBA2YUV_IYUV = COLOR_RGBA2YUV_I420,COLOR_BGRA2YUV_IYUV = COLOR_BGRA2YUV_I420,COLOR_RGB2YUV_YV12 = 131,COLOR_BGR2YUV_YV12 = 132,COLOR_RGBA2YUV_YV12 = 133,COLOR_BGRA2YUV_YV12 = 134,
?//! DemosaicingCOLOR_BayerBG2BGR = 46,COLOR_BayerGB2BGR = 47,COLOR_BayerRG2BGR = 48,COLOR_BayerGR2BGR = 49,
?COLOR_BayerBG2RGB = COLOR_BayerRG2BGR,COLOR_BayerGB2RGB = COLOR_BayerGR2BGR,COLOR_BayerRG2RGB = COLOR_BayerBG2BGR,COLOR_BayerGR2RGB = COLOR_BayerGB2BGR,
?COLOR_BayerBG2GRAY = 86,COLOR_BayerGB2GRAY = 87,COLOR_BayerRG2GRAY = 88,COLOR_BayerGR2GRAY = 89,
?//! Demosaicing using Variable Number of GradientsCOLOR_BayerBG2BGR_VNG = 62,COLOR_BayerGB2BGR_VNG = 63,COLOR_BayerRG2BGR_VNG = 64,COLOR_BayerGR2BGR_VNG = 65,
?COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG,COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG,COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG,COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG,
?//! Edge-Aware DemosaicingCOLOR_BayerBG2BGR_EA = 135,COLOR_BayerGB2BGR_EA = 136,COLOR_BayerRG2BGR_EA = 137,COLOR_BayerGR2BGR_EA = 138,
?COLOR_BayerBG2RGB_EA = COLOR_BayerRG2BGR_EA,COLOR_BayerGB2RGB_EA = COLOR_BayerGR2BGR_EA,COLOR_BayerRG2RGB_EA = COLOR_BayerBG2BGR_EA,COLOR_BayerGR2RGB_EA = COLOR_BayerGB2BGR_EA,
?//! Demosaicing with alpha channelCOLOR_BayerBG2BGRA = 139,COLOR_BayerGB2BGRA = 140,COLOR_BayerRG2BGRA = 141,COLOR_BayerGR2BGRA = 142,
?COLOR_BayerBG2RGBA = COLOR_BayerRG2BGRA,COLOR_BayerGB2RGBA = COLOR_BayerGR2BGRA,COLOR_BayerRG2RGBA = COLOR_BayerBG2BGRA,COLOR_BayerGR2RGBA = COLOR_BayerGB2BGRA,
?COLOR_COLORCVT_MAX = 143
};
?
總結(jié)
以上是生活随笔為你收集整理的OpenCV图像颜色模型转换:cvtColor函数的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。