c# OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測)
在C#中使用OpenCV進行圖像處理時,可以使用不同的算法和函數(shù)來實現(xiàn)斑點檢測、邊緣檢測和輪廓檢測。
- 斑點檢測
- 邊緣檢測
- 輪廓檢測
一、斑點檢測(Blob)
斑點檢測是指在圖像中找到明亮或暗的小區(qū)域(通常表示為斑點),并標記它們的位置??梢允褂肙penCV中的函數(shù)SimpleBlobDetector來實現(xiàn)斑點檢測。該函數(shù)將圖像轉(zhuǎn)換為二進制圖像,然后找到所有的輪廓,通過設置閾值來確定斑點的亮度范圍。
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:二值化閾值步長,用于在二值化過程中逐步增加或減小閾值,默認為10。
2. minThreshold:最小的二值化閾值,默認為50。
3. maxThreshold:最大的二值化閾值,默認為220。
4. minRepeatability:最小的斑點重復次數(shù),默認為2,表示只有當一個斑點至少在兩個不同位置被檢測到時才會被認為是有效的。
5. blobColor:斑點的亮度值,取值為0或255,默認為0,表示只檢測黑色斑點。
6. filterByArea:是否根據(jù)斑點的面積進行過濾,默認為true,表示進行過濾。
7. minArea:最小的斑點面積,默認為25,表示只檢測面積大于25的斑點。
8. maxArea:最大的斑點面積,默認為5000,表示只檢測面積小于5000的斑點。
9. filterByCircularity:是否根據(jù)斑點的圓形度進行過濾,默認為false,表示不進行過濾。
10. minCircularity:最小的斑點圓形度,默認為0.8,表示只檢測圓形度大于0.8的斑點。
11. maxCircularity:最大的斑點圓形度,默認為1,表示只檢測圓形度小于1的斑點。
12. filterByInertia:是否根據(jù)斑點的慣性比進行過濾,默認為true,表示進行過濾。
13. minInertiaRatio:最小的斑點慣性比,默認為0.1,表示只檢測慣性比大于0.1的斑點。
14. maxInertiaRatio:最大的斑點慣性比,默認為1,表示只檢測慣性比小于1的斑點。
15. filterByConvexity:是否根據(jù)斑點的凸度進行過濾,默認為true,表示進行過濾。
16. minConvexity:最小的斑點凸度,默認為0.95,表示只檢測凸度大于0.95的斑點。
17. maxConvexity:最大的斑點凸度,默認為1,表示只檢測凸度小于1的斑點。
這些參數(shù)可以根據(jù)具體應用場景進行調(diào)整,以得到符合要求的斑點檢測結(jié)果。
所使用圖例

// 讀取原始圖像
Mat image = new Mat("1.jpg", ImreadModes.Color);
// 創(chuàng)建SimpleBlobDetector參數(shù)
SimpleBlobDetector.Params parameters = new SimpleBlobDetector.Params();
// 設置參數(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:表示在水平方向上進行邊緣檢測的階數(shù)。
dy:表示在垂直方向上進行邊緣檢測的階數(shù)。
ksize:表示卷積核的大小,默認為3。
scale:可選參數(shù),用于縮放結(jié)果,默認為1。
delta:可選參數(shù),用于調(diào)整結(jié)果的偏移,默認為0。
borderType:可選參數(shù),用于指定邊界的處理方式,默認為BorderType.Default。
使用cv2.Sobel函數(shù)可以進行邊緣檢測,通過調(diào)整dx和dy的值可以獲得不同方向的邊緣信息。輸出圖像的像素值表示了對應位置的邊緣強度。
cv2.Sobel函數(shù)進行邊緣檢測的示例
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算子在水平方向上進行邊緣檢測,然后顯示結(jié)果圖像。
總之,cv2.Sobel函數(shù)是OpenCVSharp庫中的一個函數(shù),用于在圖像上應用Sobel算子進行邊緣檢測。通過調(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:要進行邊緣檢測的輸入圖像。
edges:輸出的邊緣圖像。
threshold1:第一個閾值,用于邊緣鏈接。
threshold2:第二個閾值,用于邊緣鏈接。
apertureSize:Sobel算子的孔徑大小,默認為3。
L2gradient:一個布爾值,指定求梯度大小的方法,默認為false。
Canny邊緣檢測算法的原理是:首先對圖像進行高斯濾波,然后通過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)換為二進制圖像,然后找到所有的輪廓。
輪廓檢測步驟
- Cv2.CvtColor彩色圖像轉(zhuǎn)換為灰度圖像
- cv2.threshold函數(shù)用于將圖像進行二值化處理
- Cv2.FindContours在圖像中查找輪廓
- Cv2.DrawContours在圖像上繪制輪廓
示例代碼
// 讀取圖像
Mat image = Cv2.ImRead("1.png", ImreadModes.Color);
// 將圖像轉(zhuǎn)換為灰度圖像
Mat grayImage = new Mat();
Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY); // 進行BGR2GRAY轉(zhuǎn)換
Mat ThresholdImage = new Mat();
Cv2.Threshold(grayImage, ThresholdImage, 150, 255, ThresholdTypes.Binary); // 對圖像進行二值化處理
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; // 輪廓線粗細為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)常見檢測(斑點檢測,輪廓檢測,邊緣檢測)的詳細內(nèi)容,更多關(guān)于c# OpenCvSharp的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# ManagementObjectSearcher操作window案例詳解
這篇文章主要介紹了C# ManagementObjectSearcher操作window案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08

