opencv 提供了cvtColor()函數,用於在圖像中不同的色彩空間進行轉換,用於後續處理。
void cvtColor( InputArray src, OutputArray dst, int code );
1. 圖像色彩模式
a. 位圖模式
位圖模式是圖像中最基本的格式,圖像只有黑色和白色像素,是色彩模式中佔有空間最小的,同樣也叫做黑白圖,它包含的信息量最少,無法包含圖像中的細節,相當於只有0或者1. 一副彩色圖如果要轉換成黑白模式,則一般不能直接轉換,需要首先將圖像轉換成灰度模式,再用
b. 灰度模式 CV_RGB2GRAY
灰度模式即使用單一色調來表示圖像,與位圖模式不同,不像位圖只有0和1,使用256級的灰度來表示圖像,一個像素相當於佔用8爲一個字節,每個像素值使用0到255的亮度值代表,其中0爲黑色,255爲白色,相當於從黑->灰->白的過度,通常我們所說的黑白照片就是這種模式,與位圖模式相比,能表現出一定的細節,佔用空間也比位圖模式較大.
c. RGB模式
RGB模式爲我們經常見到的,被稱爲真色彩。RGB模式的圖像有3個顏色通道,分佈爲紅(Red),綠(Green)和藍(Bule),每個都佔用8位一個字節來表示顏色信息,這樣每個顏色的取值範圍爲0~255,那麼就三種顏色就可以有多種組合,
當三種基色的值相等是,表現出爲灰色,三種顏色都爲255即爲白色,三種顏色都爲0,即爲黑色.
RGB模式的圖像佔用空間要比位圖,灰度圖都要大,但表現出的細節更加明顯.
d. HSV COLOR_BGR2HSV
色度、飽和度、亮度
e. HSB模式
是根據日常生活中人眼的視覺對色彩的觀察得而制定的一套色彩模式,最接近與人類對色彩的辨認的思考方式,所有的顏色都是用色彩三屬性來描述.
H:(色相):是指從物體反射或透過物體傳播的顏色
S:(飽和度):是指顏色的強度或純度,表示色相中灰色成分所佔的比例
B:(亮度):是指顏色對相對明暗程度,通常 100%定義爲白色;0%爲黑色
除了上述以上之外,還有索引模式,多通道模式等等不再介紹
2.圖像分割
灰度圖像大多通過算子尋找邊緣和區域生長融合來分割圖像。
彩色圖像增加了色彩信息,可以通過不同的色彩值來分割圖像,常用彩色空間HSV/HSI, RGB, LAB等都可以用於分割。
彩色圖分割函數 void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
例如根據HSV中紅色的值進行分割處理
圖像基本運算 :或,異或,非,與
void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //或
void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //異或
void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray()); //非
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask = noArray()); //與
3.
高級形態學變換:
膨脹:給圖像中的對象邊界添加像素,用結構元素的中心點對準當前正在遍歷的這個像素,然後取當前結構元素所覆蓋下的原圖對應區域內的所有像素的最大值,用這個最大值替換當前像素值,給圖像中的對象邊界添加像素,使二值圖像擴大一圈。
1. 用結構元素,掃描圖像的每一個像素
2. 用結構元素與其覆蓋的二值圖像做“與”操作
3. 如果都爲0,結果圖像的該像素爲0。否則爲1
也就是在結構元素覆蓋範圍下,只要有一個像素符和結構元素像素相同,那麼中心點對應點就爲1,否則爲0
腐蝕:刪除對象邊界的某些像素,用結構元素的中心點對準當前正在遍歷的這個像素,然後取當前結構元素所覆蓋下的原圖對應區域內的所有像素的最小值,用這個最小值替換當前像素值,刪除對象邊界的某些像素,使二值圖像減小一圈。
1. 用結構元素,掃描圖像的每一個像素
2. 用結構元素與其覆蓋的二值圖像做“與”操作
3. 如果都爲1,結果圖像的該像素爲1。否則爲0
也就是查找被處理圖像中能不能找到和結構元素相同的矩陣。如果存在那麼中心點所對應的點就爲1,否則爲0
腐蝕用於分割(isolate)獨立的圖像元素,膨脹用於連接(join)相鄰的元素
腐蝕、膨脹可用於去噪(低尺寸結構元素的腐蝕操作很容易去掉分散的椒鹽噪聲點),圖像輪廓提取、圖像分割、尋找圖像中的明顯的極大值區域或極小值區域等
開運算:MORPH_OPEN – 開運算(Opening operation)
先腐蝕,再膨脹,可清除一些小東西(亮的),放大局部低亮度的區域
閉運算:MORPH_CLOSE – 閉運算(Closing operation)
先膨脹,再腐蝕,可清除小黑點
形態學梯度:MORPH_GRADIENT - 形態學梯度(Morphological gradient)
膨脹圖與腐蝕圖之差,提取物體邊緣
頂帽:MORPH_TOPHAT - 頂帽(Top hat)
原圖像-開運算圖,突出原圖像中比周圍亮的區域
黑帽:MORPH_BLACKHAT - 黑帽(Black hat)
閉運算圖-原圖像,突出原圖像中比周圍暗的區域
getStructuringElement函數—獲取結構化元素,形態學處理,形態學操作,例如腐蝕,膨脹,開運算,閉運算等
形態學操作是根據圖像形狀進行的簡單操作,一般情況下對二值化圖像進行的操作。
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
矩形:MORPH_RECT; 交叉形:MORPH_CROSS; 橢圓形:MORPH_ELLIPSE;
morphologyEx函數利用基本的膨脹和腐蝕技術,來執行更加高級形態學變換
void morphologyEx( InputArray src, OutputArray dst,
int op, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
4. 二值圖像取輪廓
圖像的二值化就是將圖像上的像素點的灰度值設置爲0或255,這樣將使整個圖像呈現出明顯的黑白效果。
threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type ); //閾值分割,灰度圖轉至二值圖
void findContours( InputOutputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,
int method, Point offset = Point()); //輪廓檢測,只接受二值圖
5.擬合和輪廓矩形的生成
void approxPolyDP( InputArray curve,
OutputArray approxCurve,
double epsilon, bool closed );
void rectangle(InputOutputArray img, Point pt1, Point pt2,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);