Opencv 處理影象的顏色
1、用策略模式比較顏色
策略設計模式是一種面向物件的設計模式。這種模式儘可能地將演算法的複雜性隱藏在一個直觀的程式設計藉口後面,更有利於演算法的部署。
注意:在現代體系中,浮點數的歐幾里得距離的計算速度比(RGB差值的絕對值)進行累加。
2、計算向量的歐幾里得範數的函式
return static_cast<int>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));
3、cv::saturate_cast函式。計算畫素時會自動呼叫這個函式,保證畫素值在0-255。
4、threshold(output,output,maxDist,255,cv::THRESH_BINARY_INV)
這個函式通常用於將所有畫素與某個閾值(第三個引數)進行比較,並在常規閾值化模式(THRESH_BINARY)下,將所有大於指定閾值的畫素賦值為預定的最大值,。將其他畫素賦值為0。這裡用了THRESH_BINARY_INV。
一般來說,直接使用OPENCV函式,可以快速建立複雜程式,減少潛在錯誤,而且程式的執行效率通常也較高。不過這樣做會執行很多中間步驟,消耗更多記憶體。
5、floodFill函式——找出與指定顏色接近的畫素
floodFill函式的做法在判斷一個畫素時,還要檢查附近畫素的狀態,這是為了識別某種顏色的相關區域。使用者只需要指定一個起始位置和允許的誤差,就可以找出顏色相近的連續區域。
cv::floodFill(image,//輸入、輸出影象
Point(100,50),起始點(與這個點比較,找這個點畫素的近似)
Scalar(255,255,255),填充顏色
Rect* 0,填充區域的邊界矩形(繪製的顏色,這裡是白色)
Scalar(35,35,35),偏差的最小、最大閾值
Scalar(35,35,35),正差閾值,兩個閾值通常相等
FLOODFILL_FIXED_RANGE);與起始點畫素比較
顏色接近的畫素會被重新繪製成第三個引數指定的新顏色。
定義比參考色更高或更低的值作為閾值。
6、GrabCut演算法分割影象
從靜態影象中提取前景物體,使用GrabCut演算法。
Mat result;
Mat bgModel,fgModel;
grabCut(image,//輸入影象
result,分割結果
rectangle,包含前景的矩形
bgModel,fgModel,模型
5,迭代次數
GC_INIT_WITH_RECT);使用矩形
這裡,使用GC_INIT_WITH_RECT引數表示使用帶邊框的矩形模型。輸入/輸出的分割影象可以是以下四個值:
GC_BGD//明確屬於背景的畫素
GC_FGD明確屬於前景的畫素
GC_PR_BGD可能屬於背景的畫素
GC_PR_BGD可能屬於前景的畫素
呼叫這個函式之後,取得結果方式:
compare(result,GC_PR_FGD,result,CMP_EQ);
foreground(image.size(),CV_8UC3,Scalar(255,255,255);
image.copyTo(foreground,result);
實現原理:把所有未標記的畫素臨時標記為前景,基於當前的分類情況,演算法把畫素劃分為多個顏色相近的組,引入前景和背景畫素之間的邊緣,確定背景前景的分割。在此過程中,將試圖連線具有相似標記的畫素,並且避免邊緣出現在強度相對均勻的區域。
把問題表示成一幅連同的矩形,然後在圖形上分割,以形成最優的解決方案。分割完畢後,畫素會有新的標記,然後重複這個分組過程,找到最優的分割方案。