c# OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測)
在C#中使用OpenCV進(jìn)行圖像處理時,可以使用不同的算法和函數(shù)來實現(xiàn)斑點檢測、邊緣檢測和輪廓檢測。
- 斑點檢測
- 邊緣檢測
- 輪廓檢測
一、斑點檢測(Blob)
斑點檢測是指在圖像中找到明亮或暗的小區(qū)域(通常表示為斑點),并標(biāo)記它們的位置??梢允褂肙penCV中的函數(shù)SimpleBlobDetector來實現(xiàn)斑點檢測。該函數(shù)將圖像轉(zhuǎn)換為二進(jìn)制圖像,然后找到所有的輪廓,通過設(shè)置閾值來確定斑點的亮度范圍。
SimpleBlobDetector.Params
//函數(shù)原型 public Params() { Data = new WParams { thresholdStep = 10f, minThreshold = 50f, maxThreshold = 220f, minRepeatability = 2u, minDistBetweenBlobs = 10f, filterByColor = 1, blobColor = 0, filterByArea = 1, minArea = 25f, maxArea = 5000f, filterByCircularity = 0, minCircularity = 0.8f, maxCircularity = float.MaxValue, filterByInertia = 1, minInertiaRatio = 0.1f, maxInertiaRatio = float.MaxValue, filterByConvexity = 1, minConvexity = 0.95f, maxConvexity = float.MaxValue }; }
SimpleBlobDetector是OpenCV中用于檢測二值圖像中的斑點的類,以下是它的參數(shù)說明:
1. thresholdStep:二值化閾值步長,用于在二值化過程中逐步增加或減小閾值,默認(rèn)為10。
2. minThreshold:最小的二值化閾值,默認(rèn)為50。
3. maxThreshold:最大的二值化閾值,默認(rèn)為220。
4. minRepeatability:最小的斑點重復(fù)次數(shù),默認(rèn)為2,表示只有當(dāng)一個斑點至少在兩個不同位置被檢測到時才會被認(rèn)為是有效的。
5. blobColor:斑點的亮度值,取值為0或255,默認(rèn)為0,表示只檢測黑色斑點。
6. filterByArea:是否根據(jù)斑點的面積進(jìn)行過濾,默認(rèn)為true,表示進(jìn)行過濾。
7. minArea:最小的斑點面積,默認(rèn)為25,表示只檢測面積大于25的斑點。
8. maxArea:最大的斑點面積,默認(rèn)為5000,表示只檢測面積小于5000的斑點。
9. filterByCircularity:是否根據(jù)斑點的圓形度進(jìn)行過濾,默認(rèn)為false,表示不進(jìn)行過濾。
10. minCircularity:最小的斑點圓形度,默認(rèn)為0.8,表示只檢測圓形度大于0.8的斑點。
11. maxCircularity:最大的斑點圓形度,默認(rèn)為1,表示只檢測圓形度小于1的斑點。
12. filterByInertia:是否根據(jù)斑點的慣性比進(jìn)行過濾,默認(rèn)為true,表示進(jìn)行過濾。
13. minInertiaRatio:最小的斑點慣性比,默認(rèn)為0.1,表示只檢測慣性比大于0.1的斑點。
14. maxInertiaRatio:最大的斑點慣性比,默認(rèn)為1,表示只檢測慣性比小于1的斑點。
15. filterByConvexity:是否根據(jù)斑點的凸度進(jìn)行過濾,默認(rèn)為true,表示進(jìn)行過濾。
16. minConvexity:最小的斑點凸度,默認(rèn)為0.95,表示只檢測凸度大于0.95的斑點。
17. maxConvexity:最大的斑點凸度,默認(rèn)為1,表示只檢測凸度小于1的斑點。
這些參數(shù)可以根據(jù)具體應(yīng)用場景進(jìn)行調(diào)整,以得到符合要求的斑點檢測結(jié)果。
所使用圖例
// 讀取原始圖像 Mat image = new Mat("1.jpg", ImreadModes.Color); // 創(chuàng)建SimpleBlobDetector參數(shù) SimpleBlobDetector.Params parameters = new SimpleBlobDetector.Params(); // 設(shè)置參數(shù) parameters.FilterByArea = true; parameters.MinArea = 100; parameters.MaxArea = 10000; // 創(chuàng)建SimpleBlobDetector SimpleBlobDetector detector = SimpleBlobDetector.Create(parameters); // 檢測斑點 KeyPoint[] keypoints = detector.Detect(image); // 在圖像上繪制斑點 Mat result = new Mat(); Cv2.DrawKeypoints(image, keypoints, result, Scalar.All(-1), DrawMatchesFlags.Default); // 顯示結(jié)果 Cv2.ImShow("Result", result); Cv2.WaitKey(0);
二、邊緣檢測
邊緣檢測是一種圖像處理技術(shù),可以找到圖像中的邊緣或邊界。penCV 中提供的兩種重要邊緣檢測算法:Sobel邊緣檢測和 canny邊緣檢測。
1、cv2.Sobel()
//函數(shù)原型 public static void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize = 3, double scale = 1, double delta = 0, BorderType borderType = BorderType.Default )
參數(shù)說明:
src:輸入圖像。
dst:輸出圖像,是一個與輸入圖像相同大小和類型的圖像。
ddepth:輸出圖像的深度,通常使用-1表示與輸入圖像相同深度。
dx:表示在水平方向上進(jìn)行邊緣檢測的階數(shù)。
dy:表示在垂直方向上進(jìn)行邊緣檢測的階數(shù)。
ksize:表示卷積核的大小,默認(rèn)為3。
scale:可選參數(shù),用于縮放結(jié)果,默認(rèn)為1。
delta:可選參數(shù),用于調(diào)整結(jié)果的偏移,默認(rèn)為0。
borderType:可選參數(shù),用于指定邊界的處理方式,默認(rèn)為BorderType.Default。
使用cv2.Sobel函數(shù)可以進(jìn)行邊緣檢測,通過調(diào)整dx和dy的值可以獲得不同方向的邊緣信息。輸出圖像的像素值表示了對應(yīng)位置的邊緣強(qiáng)度。
cv2.Sobel函數(shù)進(jìn)行邊緣檢測的示例
using OpenCvSharp; Mat srcImage = new Mat("input.jpg", ImreadModes.Color); Mat grayImage = new Mat(); Cv2.CvtColor(srcImage, grayImage, ColorConversionCodes.BGR2GRAY); Mat edges = new Mat(); Cv2.Sobel(grayImage, edges, MatType.CV_8U, 1, 0, 3); Cv2.ImShow("Edges", edges); Cv2.WaitKey(0);
這個示例將輸入圖像轉(zhuǎn)換為灰度圖像,并使用Sobel算子在水平方向上進(jìn)行邊緣檢測,然后顯示結(jié)果圖像。
總之,cv2.Sobel函數(shù)是OpenCVSharp庫中的一個函數(shù),用于在圖像上應(yīng)用Sobel算子進(jìn)行邊緣檢測。通過調(diào)整參數(shù)可以獲得不同方向的邊緣信息。
2、cv2.Canny()
public static void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)
參數(shù)說明:
image:要進(jìn)行邊緣檢測的輸入圖像。
edges:輸出的邊緣圖像。
threshold1:第一個閾值,用于邊緣鏈接。
threshold2:第二個閾值,用于邊緣鏈接。
apertureSize:Sobel算子的孔徑大小,默認(rèn)為3。
L2gradient:一個布爾值,指定求梯度大小的方法,默認(rèn)為false。
Canny邊緣檢測算法的原理是:首先對圖像進(jìn)行高斯濾波,然后通過Sobel算子計算圖像的梯度,再通過非極大值抑制來提取局部最大值作為邊緣點,最后通過雙閾值檢測來連接邊緣點。
cv2.Canny函數(shù)的示例代碼:
using OpenCvSharp; class Program { static void Main(string[] args) { // 讀取圖像 Mat image = Cv2.ImRead("image.jpg", ImreadModes.Color); // 將圖像轉(zhuǎn)換為灰度圖像 Mat grayImage = new Mat(); Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY); // 使用Canny邊緣檢測算法檢測邊緣 Mat edges = new Mat(); Cv2.Canny(grayImage, edges, 100, 200); // 顯示原始圖像和邊緣圖像 Cv2.ImShow("Original Image", image); Cv2.ImShow("Edges", edges); Cv2.WaitKey(0); // 釋放內(nèi)存 Cv2.DestroyAllWindows(); image.Dispose(); grayImage.Dispose(); edges.Dispose(); } }
這個示例代碼從文件中讀取圖像,然后將其轉(zhuǎn)換為灰度圖像。然后,它使用Canny邊緣檢測算法檢測圖像中的邊緣,并將結(jié)果顯示出來。最后,釋放內(nèi)存并關(guān)閉窗口。
注意:在運行此代碼之前,確保已在項目中添加對OpenCVSharp庫的引用,并將圖像文件與示例代碼放在同一目錄下,并將圖像文件名替換為實際的圖像文件名
三、 輪廓檢測
輪廓檢測是一種從圖像中提取物體形狀的技術(shù)。OpenCV中的cvFindContours函數(shù)可以實現(xiàn)輪廓檢測。該函數(shù)將圖像轉(zhuǎn)換為二進(jìn)制圖像,然后找到所有的輪廓。
輪廓檢測步驟
- Cv2.CvtColor彩色圖像轉(zhuǎn)換為灰度圖像
- cv2.threshold函數(shù)用于將圖像進(jìn)行二值化處理
- Cv2.FindContours在圖像中查找輪廓
- Cv2.DrawContours在圖像上繪制輪廓
示例代碼
// 讀取圖像 Mat image = Cv2.ImRead("1.png", ImreadModes.Color); // 將圖像轉(zhuǎn)換為灰度圖像 Mat grayImage = new Mat(); Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY); // 進(jìn)行BGR2GRAY轉(zhuǎn)換 Mat ThresholdImage = new Mat(); Cv2.Threshold(grayImage, ThresholdImage, 150, 255, ThresholdTypes.Binary); // 對圖像進(jìn)行二值化處理 Cv2.ImShow("ThresholdImage", ThresholdImage); Cv2.WaitKey(0); OpenCvSharp.Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(ThresholdImage, out contours, out hierarchy, RetrievalModes.List, ContourApproximationModes.ApproxSimple); Scalar color = new Scalar(0, 255, 0); // 輪廓顏色為綠色 int thickness = 2; // 輪廓線粗細(xì)為2 for (int i = 0; i < contours.Length; i++) { Cv2.DrawContours(ThresholdImage, contours, i, color, thickness); // 繪制輪廓 } Cv2.ImShow("Contours", ThresholdImage); // 顯示圖像 Cv2.WaitKey(0);
以上就是c# OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測)的詳細(xì)內(nèi)容,更多關(guān)于c# OpenCvSharp的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#?Unity使用正則表達(dá)式去除部分富文本的代碼示例
正則表達(dá)式在我們?nèi)粘i_發(fā)中的用處不用多說了吧,下面這篇文章主要給大家介紹了關(guān)于C#?Unity使用正則表達(dá)式去除部分富文本的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03c# DataView.ToTable()方法 去除表的重復(fù)項問題
這篇文章主要介紹了c# DataView.ToTable()方法 去除表的重復(fù)項問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12將文件夾下所有文件輸出到日志文件中 c#遞歸算法學(xué)習(xí)示例
這篇文章主要介紹了將文件夾下所有文件輸出到日志文件中,通過這個示例我們學(xué)習(xí)一下遞歸算法的使用方法2014-01-01