導航:首頁 > 源碼編譯 > opencv白平衡演算法

opencv白平衡演算法

發布時間:2023-07-13 13:15:56

① OpenCV-Python教程:19.輪廓屬性

1圖像矩

幫你計算一些屬性,比如重心,面積等。

函數cv2.moments()會給你一個字典,包含所有矩值

你可以從這個裡面得到有用的數據比如面積,重心等。重心可以用下面的式子得到:

2.輪廓面積

輪廓面積由函數cv2.contourArea()得到或者從矩里得到M['m00']

3.輪廓周長

可以用cv2.arcLength()函數得到。第二個參數指定形狀是否是閉合的輪廓(如果傳True)。或者只是一個曲線。

4.輪廓近似

這會把輪廓形狀近似成別的邊數少的形狀,邊數由我們指定的精確度決定。這是Douglas-Peucker演算法的實現。

要理解這個,假設你試圖找一個圖像里的方塊,但是由於圖像里的一些問題,你得不到一個完美的方塊,只能得到一個「壞方塊」。現在你可以使用這個函數來近似,第二個參數叫epsilon,是從輪廓到近似輪廓的最大距離。是一個准確率參數,好的epsilon的選擇可以得到正確的輸出。

在下面第二個圖像里,綠線顯示了epsilon = 10% of arc length 的近似曲線。第三個圖像顯示了epsilon = 1% of the arc length。第三個參數指定曲線是否閉合。

5.凸形外殼

凸形外殼和輪廓近似類似,但是還不一樣(某些情況下兩個甚至提供了同樣的結果)。這兒,cv2.convexHull()函數檢查凸面曲線缺陷並修復它。一般來說,凸面曲線總是外凸的,至少是平的,如果它內凹了,這就叫凸面缺陷。比如下面這張圖,紅線顯示了手的凸形外殼。雙向箭頭顯示了凸面缺陷,是輪廓外殼的最大偏差。

參數詳情:

·points 是我們傳入的輪廓
·hull 是輸出,一般我們不用傳
·clockwise: 方向標示,如果是True,輸出凸形外殼是順時針方向的。否則,是逆時針的。
·returnPoints:默認是True。然後會返回外殼的點的坐標。如果為False,它會返回輪廓對應外殼點的索引。

所以要獲得凸形外殼,下面

但是如果你想找到凸面缺陷,你需要傳入returnPoints = False。我們拿上面的矩形圖形來說,首先我找到他的輪廓cnt,現在用returnPoints = True來找他的凸形外殼,我得到下面的值:[[[234 202]], [[51 202]], [51 79]], [[234 79]]]  是四個角的點。如果你用returnPoints = False,我會得到下面的結果:[[129], [67], [0], [142]].  這是輪廓里對應點的索引,比如cnt[129] = [234, 202]],這和前面結果一樣。

6.檢查凸面

有一個函數用來檢查是否曲線是凸面, cv2.isContourConvex().它返回True或False。

7.邊界矩形

有兩種邊界矩形

7.a.正邊界矩形

這個矩形不考慮對象的旋轉,所以邊界矩形的面積不是最小的,函數是cv2.boundingRect()。

假設矩形左上角的坐標是(x,y), (w, h)是它的寬和高

7.b.渲染矩形

這個邊界矩形是用最小面積畫出來的,所以要考慮旋轉。函數是cv2.minAreaRect()。它返回一個Box2D結構,包含了(左上角(x,y),(width, height),旋轉角度)。但是要畫這個矩形我們需要4個角。這四個角用函數cv2.boxPoints()得到

8.最小閉包圓

我們找一個目標的外接圓可以用函數cv2.minEnclosingCircle().這個圓用最小面積完全包圍目標。

9.橢圓

用一個橢圓來匹配目標。它返回一個旋轉了的矩形的內接橢圓

10. 直線

類似的我們可以匹配一根直線,下面的圖像包含一系列的白色點,我們可以給它一條近似的直線。

END

② 圖片處理-opencv-10.圖像銳化與邊緣檢測

 

Roberts運算元又稱為交叉微分演算法,它是基於交叉差分的梯度演算法,通過局部差分計算檢測邊緣線條。常用來處理具有陡峭的低雜訊圖像,當圖像邊緣接近於正45度或負45度時,該演算法處理效果更理想。其缺點是對邊緣的定位不太准確,提取的邊緣線條較粗。

Prewitt是一種圖像邊緣檢測的微分運算元,其原理是利用特定區域內像素灰度值產生的差分實現邊緣檢測。由於Prewitt運算元採用3 3模板對區域內的像素值進行計算,而Robert運算元的模板為2 2,故Prewitt運算元的邊緣檢測結果在水平方向和垂直方向均比Robert運算元更加明顯。Prewitt運算元適合用來識別雜訊較多、灰度漸變的圖像。

dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

RSobel運算元是一種用於邊緣檢測的離散微分運算元,它結合了高斯平滑和微分求導。該運算元用於計算圖像明暗程度近似值,根據圖像邊緣旁邊明暗程度把該區域內超過某個數的特定點記為邊緣。Sobel運算元在Prewitt運算元的基礎上增加了權重的概念,認為相鄰點的距離遠近對當前像素點的影響是不同的,距離越近的像素點對應當前像素的影響越大,從而實現圖像銳化並突出邊緣輪廓。Sobel運算元的邊緣定位更准確,常用於雜訊較多、灰度漸變的圖像。

Sobel運算元根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對雜訊具有平滑作用,提供較為精確的邊緣方向信息。因為Sobel運算元結合了高斯平滑和微分求導(分化),因此結果會具有更多的抗噪性,當對精度要求不是很高時,Sobel運算元是一種較為常用的邊緣檢測方法。

dst = Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

在進行Sobel運算元處理之後,還需要調用convertScaleAbs()函數計算絕對值,並將圖像轉換為8點陣圖進行顯示

dst = convertScaleAbs(src[, dst[, alpha[, beta]]])

拉普拉斯(Laplacian)運算元是n維歐幾里德空間中的一個二階微分運算元,常用於圖像增強領域和邊緣提取。它通過灰度差分計算鄰域內的像素,基本流程是:判斷圖像中心像素灰度值與它周圍其他像素的灰度值,如果中心像素的灰度更高,則提升中心像素的灰度;反之降低中心像素的灰度,從而實現圖像銳化操作。在演算法實現過程中,Laplacian運算元通過對鄰域中心像素的四方向或八方向求梯度,再將梯度相加起來判斷中心像素灰度與鄰域內其他像素灰度的關系,最後通過梯度運算的結果對像素灰度進行調整。

Laplacian運算元分為四鄰域和八鄰域,四鄰域是對鄰域中心像素的四方向求梯度,八鄰域是對八方向求梯度。當鄰域內像素灰度相同時,模板的卷積運算結果為0;當中心像素灰度高於鄰域內其他像素的平均灰度時,模板的卷積運算結果為正數;當中心像素的灰度低於鄰域內其他像素的平均灰度時,模板的卷積為負數。對卷積運算的結果用適當的衰弱因子處理並加在原中心像素上,就可以實現圖像的銳化處理。

dst = Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

由於Sobel運算元在計算相對較小的核的時候,其近似計算導數的精度比較低,比如一個33的Sobel運算元,當梯度角度接近水平或垂直方向時,其不精確性就越發明顯。Scharr運算元同Sobel運算元的速度一樣快,但是准確率更高,尤其是計算較小核的情景,所以利用3*3濾波器實現圖像邊緣提取更推薦使用Scharr運算元

Scharr運算元又稱為Scharr濾波器,也是計算x或y方向上的圖像差分,在OpenCV中主要是配合Sobel運算元的運算而存在的。Scharr運算元的函數原型如下所示,和Sobel運算元幾乎一致,只是沒有ksize參數.

dst = Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]])

Canny邊緣檢測運算元(多級邊緣檢測演算法)是一種被廣泛應用於邊緣檢測的標准演算法,其目標是找到一個最優的邊緣檢測解或找尋一幅圖像中灰度強度變化最強的位置。最優邊緣檢測主要通過低錯誤率、高定位性和最小響應三個標准進行評價。

Canny運算元的實現步驟如下:

edges = Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

LOG(Laplacian of Gaussian)邊緣檢測運算元也稱為Marr&Hildreth運算元,它根據圖像的信噪比來求檢測邊緣的最優濾波器。該演算法首先對圖像做高斯濾波,然後再求其拉普拉斯(Laplacian)二階導數,根據二階導數的過零點來檢測圖像的邊界,即通過檢測濾波結果的零交叉(Zero crossings)來獲得圖像或物體的邊緣。

LOG運算元該綜合考慮了對雜訊的抑制和對邊緣的檢測兩個方面,並且把Gauss平滑濾波器和Laplacian銳化濾波器結合了起來,先平滑掉雜訊,再進行邊緣檢測,所以效果會更好。 該運算元與視覺生理中的數學模型相似,因此在圖像處理領域中得到了廣泛的應用。它具有抗干擾能力強,邊界定位精度高,邊緣連續性好,能有效提取對比度弱的邊界等特點。

③ 如何使用Opencv對圖像進行顏色特徵提取

打開小畫家,將色卡打開,點擊吸管工具,移動滑鼠到紅色塊上方,松開滑鼠,此時,吸管工具已經提取了紅色色塊信息。然後點擊右方的「編輯顏色」,彈出顏色選擇對話框,此時,右下角有剛才習慣的紅綠藍顏色信息,如紅152,綠18,藍15。這個就是顏色對應的RGB色彩值。

創建VC控制台工程,加入所需頭文件和庫文件。注意要事先將opencv 頭文件和庫文件添加到工程屬性中,作者使用opencv2.4+VC2010示範。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <math.h>
#pragma comment (lib,"opencv_core244d.lib")
#pragma comment (lib,"opencv_highgui244d.lib")
#pragma comment (lib,"opencv_imgproc244d.lib")

定義一個顏色常量target,默認值即為剛才吸管工具提取的紅色色塊的RGB值分量,和一個計算與顏色標准值色差的函數,暫定為色差在10以內即為相近顏色。這里cv::Vec3b 變數對應一個數組值, Vec3b[0] 對應blue,Vec3b[1]對應green,Vec3b[2]對應Red,即BGR。

接著添加以下代碼,目的為讀取源圖片,根據圖片大小做一定的縮放,然後定義同樣大小的一個灰度圖,用於存貯計算結果值。核心演算法如下,遍歷源圖片,色差(與紅色色塊比較)低於30的即為需要提取的顏色值,將此像素位置記錄並寫入到灰度圖中,以黑色顯示,否則設置為白色。然後將處理前後圖片顯示出來。

實際商業應用中也是可以如法炮製的,比如下圖的葯片,大小,顏色不統一,如何提取識別黃色小葯片在何處或計算其數量呢。
筆者嘗試使用吸管工具提取其BGR值為(22,184,245),將色差由10調整為30,可以正確檢測此葯片。如圖。

④ OpenCV-Python教程:57.圖像修復

基礎

你們可能家裡都會有一些老照片已經有黑點啊,劃痕啊等。你有想過修復它們么?我們不能簡單的在繪圖工具里把他們擦除了就完了。因為這樣只是把黑色的東西變成白色的而已,實際上沒用。在這種情況下,會用到一種技術叫圖像修復。基本的思想很簡單:用周圍的像素替換壞掉的像素,這樣看上去就和周圍一樣了。比如下面這張:

很多演算法被設計來干這個,OpenCV提供了兩個,可以用同一個函數來訪問: cv2.inpaint()

第一個演算法是基於論文" An Image Inpainting Technique Based on the Fast Marching Method"。 是基於快速匹配方法的。假設圖像里的一個區域要修復。演算法從這個區域的邊界開始,逐漸地進入區域,把邊界內的所有東西填充上。它取要修復的部分周圍的一個像素周圍的一小片鄰居。這個像素被周圍已知的像素的標准加權和替換掉。選擇權重是很重要的。要修復的點周圍像素的權重較高。和正常邊界近的,還有在邊界輪廓上的像素的權重較高。當像素被修復以後,它會通過快速匹配方法(FMM)移動到最近的像素。FMM保證那些已知像素周圍的像素首先被修復,所以這個就像人工啟發式的操作一樣。這個演算法使用標志cv2.INPAINT_TELEA開啟。

第二個演算法基於論文" Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting ".這個演算法基於流體動力學和偏微分方程。基本原則是啟發式。它首從已知區域先沿著邊緣到未知區域訪問(由於邊緣應該是連續的)。在匹配邊要修復區域邊界的梯度向量時持續畫等值線(把相同亮度的點用線連起來,類似於輪廓線)。這時候用到流體動力學。之後會填充顏色以減小最小方差。這個演算法用標志cv2.INPAINT_NS啟用。

編碼

我們需要創建和輸入圖像相同大小的掩圖,需要修復的區域對應的像素要非0.剩下的就簡單了。我的圖像被一些黑色劃痕給破壞了(實際上是我自己加的)。我用繪圖工具對應的標記出來。

看下面的結果。第一個圖片是輸入圖像,第二個是掩圖,第三個是用第一種演算法的結果,最後一張是第二種演算法的結果。

END

閱讀全文

與opencv白平衡演算法相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:736
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163