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);

實現原理:把所有未標記的像素臨時標記爲前景,基於當前的分類情況,算法把像素劃分爲多個顏色相近的組,引入前景和背景像素之間的邊緣,確定背景前景的分割。在此過程中,將試圖連接具有相似標記的像素,並且避免邊緣出現在強度相對均勻的區域。

把問題表示成一幅連同的矩形,然後在圖形上分割,以形成最優的解決方案。分割完畢後,像素會有新的標記,然後重複這個分組過程,找到最優的分割方案。

 

 

 

 

 

   

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章