一、顏色模型與轉換
1.1RGB顏色模型
RGB顏色空間模型:
該模型的命名方式是采用三種顏色的英文首字母,分別是紅色,綠色,和藍色,在RGB模型中所有的顏色都是這三種顏色通過不同比例的混合模型,如果三種顏色都為零,則表示為黑色,如果三種顏色的分量相同且都為最大值,則表示為白色,在這個基礎上增加第四個通道即為RGBA模型,第四個通道表示顏色的透明度,當沒有透明度需求的時候,RGBA模型就會退化成RGB模型,
1.2YUV顏色模型
YUV模型是電視信號系統所采用的顏色編碼方式,這三個變數分別表示像素的亮度(Y)、紅色分量與亮度信號差值(U)、藍色與亮度的差值(V),這種顏色模型主要用于視頻和影像的傳輸,RGB模型與YUV模型之間的轉換關系如下:

1.3HSV顏色模型
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無定義,代表白色,

1.4Lab顏色模型
Lab顏色模型彌補來了RGB顏色模型的不足,是一種設備無關和基礎與生理特征的顏色模型,在模型中, L表示亮度,a和b是兩個顏色通道,兩者的取值區間都是-128~127,其中a通道數值有小到打對應的顏色是從綠色變成紅色,b通道數值由小到大對應的顏色是由藍色變成黃色,

1.5GRAY顏色模型
GRAY模型并不是一個彩色模型,而是一個灰度影像,灰度影像具有相同尺寸相同亞索格式所占容量小,易于采集,便于傳輸等優點,常用RGB模型轉化成灰度影像的方式:
GRAY = 0.3R+ 0.59G+ 0.11B
1.6不同顏色模型之間的互相轉換
OpenCV提供了cvtColor()函式用于轉化功能,
void cv::cvtColor(InputArray src,
OutputArray dst,
int code,
int dstCn = 0
)
src: 待轉換顏色模型的原始影像,
dst:轉換顏色模型后的目標影像,
code:顏色空間轉換的標志,
dstCn:目標影像中的通道數,
如果轉換程序中添加了alpha通道(RGB模型中第四個通道,表示透明度),則其值將設定為相應通道范圍的最大值:CV_8U為255,CV_16U為65535,CV_32F為1,
| 標志引數 | 簡記 | 作用 |
| COLOR_BGR2BGRA | 0 | 對RGB影像添加alpha通道 |
| COLOR_BGR2RGB | 4 | 彩色影像通道顏色順序的更改 |
| COLOR_BGR2GRAY | 10 | 彩色影像轉化成灰度影像 |
| COLOR_GRAY2BGR | 8 | 灰度影像轉化成彩色影像(偽彩色) |
| COLOR_BGR2YUV | 82 | RGB顏色模型轉成YUV顏色模型 |
| COLOR_YUV2BGR | 84 | YUV顏色模型轉成RGB顏色模型 |
| COLOR_BGR2HSV | 40 | RGB顏色模型轉成HSV顏色模型 |
| COLOR_HSV2BGR | 54 | HSV顏色模型轉成RGB顏色模型 |
| COLOR_BGR2Lab | 44 | BGR顏色模型轉成Lab顏色模型 |
| COLOR_Lab2BGR | 56 | Lab顏色模型轉成RGB顏色模型 |
代碼實體:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lena.png");
if (img.empty())
{
cout << "請檢查輸入的影像資料是否正確" << endl;
return -1;
}
Mat gray, HSV, YUV, Lab;
cvtColor(img, HSV, COLOR_BGR2HSV);
cvtColor(img, YUV, COLOR_BGR2YUV);
cvtColor(img, Lab, COLOR_BGR2Lab);
cvtColor(img, gray, COLOR_BGR2GRAY);
imshow("原圖", img);
imshow("HSV", HSV);
imshow("YUV", YUV);
imshow("Lab", Lab);
imshow("gray", gray);
waitKey(0);
return 0;
}
二、多通道分離函式與合并
2.1多通道分離函式split()
OpenCV中針對多通道分離函式split()有兩種多載原型,
void cv::split(const Mat &src,
Mat *mvbegin
)
void cv::split(InputArray m,
OutArray mv
)
src:帶分離的多通道影像,
mvbegin:分離后的單通道影像,為陣列形式,陣列大小需要與影像的通道數相同,
m:帶分離的多通道影像,
mv:分離后的單通道影像,為向量(vector)形式,
雖然兩個函式原型輸入引數的型別不同,但通道分離的原理是相同的,可以用下式表示:
mv[c](I) = src(I)
2.2多通道合并函式merge()
OpenCV針對多通道分離合并函式merge()也有兩種多載原型,
void cv::merge(const Mat &mv,
size_t cout,
OutputArray dst
)
void cv::merge(InputArrayOfArrays mv,
OutputArray dst
)
mv(第一種多載原型引數) : 需要合并的影像陣列,其中每個影像必須有相同的尺寸和資料型別,
cout:輸入的影像陣列的長度,其數值必須大于0,
mv(第二種多載原型引數):需要合并的影像向量(vector),其中每個影像必須擁有相同的尺寸和資料型別,
dst:合并后輸出的影像,與mv[0]具有相同的尺寸和資料型別,通道數等于所有輸入影像的通道數總和,
2.3影像多通道分離與合并例程
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("C:\\Users\\王淏\\Pictures\\f9afe18da2fb1fa2ff72c4d8b29fe6a (2).png");
if (img.empty())
{
cout << "請檢查輸入的影像資料是否正確" << endl;
return -1;
}
Mat HSV;
cvtColor(img, HSV, COLOR_BGR2HSV);
Mat imgs0, imgs1, imgs2; //用于存放陣列型別的結果
Mat imgv0, imgv1, imgv2; //用于存放vector型別的結果
Mat result0, result1, result2; //多通道合并的結果
//輸入陣列引數的多通道分離與合并0
Mat imgs[3];
split(img, imgs);
imgs0 = imgs[0];
imgs1 = imgs[1];
imgs2 = imgs[2];
imshow("RGB-B通道", imgs0);
imshow("RGB-G通道", imgs1);
imshow("RGB-R通道", imgs2);
imgs[2] = img; //將陣列中的影像通道數變成不一致
merge(imgs, 3, result0); //合并影像
//imshow("result0", result0); imshow最多顯示4個通道因此結果Image Watch中查看
Mat zero = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
imgs[0] = zero;
imgs[2] = zero;
merge(imgs , 3, result1);
imshow("result1", result1);
//輸入vector引數的多通道分離與合并
vector<Mat> imgv;
split(HSV, imgv);
imgv0 = imgv.at(0);
imgv1 = imgv.at(1);
imgv2 = imgv.at(2);
imshow("HSV-H通道", imgv0);
imshow("HSV-S通道", imgv1);
imshow("HSV-V通道", imgv2);
imgv.push_back(HSV); //將vector中的影像通道數變成不一致
merge(imgv, result2);
//imshow("result2", result2); imshow最多顯示4個通道,因此結果在Image Watch中查看
waitKey(0);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301373.html
標籤:其他
