A. opencv實現人臉識別有多少種演算法
OpenCV在2.4.1以後的版本中開始自帶人臉識別,共有三種人臉識別演算法的實現,分別是PCA , LDA , LBPH. OpenCV2創建方法如下:
cv::Ptr<cv::FaceRecognizer>facerPCA,facerLDA;
cv::Ptr<cv::FaceRecognizer>facerLBPH=cv::createLBPHFaceRecognizer();
facerPCA=cv::Algorithm::create<cv::FaceRecognizer>("FaceRecognizer.Eigenfaces");
facerLDA=cv::Algorithm::create<cv::FaceRecognizer>("FaceRecognizer.Fisherfaces");
在OpenCV3中,人臉識別的實現被移動到第三方庫opencv_contrib中,而且OpenCV3版本的各個版本3.0.0,3.2.0,3.3.0的創建方法均不同,且都被移動到cv::face::名字空間下.
B. 圖片處理-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銳化濾波器結合了起來,先平滑掉雜訊,再進行邊緣檢測,所以效果會更好。 該運算元與視覺生理中的數學模型相似,因此在圖像處理領域中得到了廣泛的應用。它具有抗干擾能力強,邊界定位精度高,邊緣連續性好,能有效提取對比度弱的邊界等特點。
C. 基於opencv的紙張表面質量檢測演算法中
opencv裡面是沒有那種演算法的,它只是提供一些常用的計算函數。具體的演算法,由於你的需求比較特殊,相信應該沒有現成的瑕疵檢測演算法,好在你的需求難度應該不大,通過常用的圖像識別演算法,比如紋理演算法(Gabor演算法)、SURF演算法就可以找到白紙上瑕疵,這些瑕疵都是相當於一張白紙的特徵點嘛!基本思想就是借用圖像識別、匹配過程的思想——找圖像上的特徵點。白紙一般是提取不出特徵點的,要是提取出來了,那就說明白紙上有東西(洞、褶皺或者異物)。