c# OpenCvSharp實(shí)現(xiàn)常見檢測(cè)(斑點(diǎn)檢測(cè),輪廓檢測(cè),邊緣檢測(cè))
在C#中使用OpenCV進(jìn)行圖像處理時(shí),可以使用不同的算法和函數(shù)來實(shí)現(xiàn)斑點(diǎn)檢測(cè)、邊緣檢測(cè)和輪廓檢測(cè)。
- 斑點(diǎn)檢測(cè)
- 邊緣檢測(cè)
- 輪廓檢測(cè)
一、斑點(diǎn)檢測(cè)(Blob)
斑點(diǎn)檢測(cè)是指在圖像中找到明亮或暗的小區(qū)域(通常表示為斑點(diǎn)),并標(biāo)記它們的位置。可以使用OpenCV中的函數(shù)SimpleBlobDetector來實(shí)現(xiàn)斑點(diǎn)檢測(cè)。該函數(shù)將圖像轉(zhuǎn)換為二進(jìn)制圖像,然后找到所有的輪廓,通過設(shè)置閾值來確定斑點(diǎ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中用于檢測(cè)二值圖像中的斑點(diǎn)的類,以下是它的參數(shù)說明:
1. thresholdStep:二值化閾值步長(zhǎng),用于在二值化過程中逐步增加或減小閾值,默認(rèn)為10。
2. minThreshold:最小的二值化閾值,默認(rèn)為50。
3. maxThreshold:最大的二值化閾值,默認(rèn)為220。
4. minRepeatability:最小的斑點(diǎn)重復(fù)次數(shù),默認(rèn)為2,表示只有當(dāng)一個(gè)斑點(diǎn)至少在兩個(gè)不同位置被檢測(cè)到時(shí)才會(huì)被認(rèn)為是有效的。
5. blobColor:斑點(diǎn)的亮度值,取值為0或255,默認(rèn)為0,表示只檢測(cè)黑色斑點(diǎn)。
6. filterByArea:是否根據(jù)斑點(diǎn)的面積進(jìn)行過濾,默認(rèn)為true,表示進(jìn)行過濾。
7. minArea:最小的斑點(diǎn)面積,默認(rèn)為25,表示只檢測(cè)面積大于25的斑點(diǎn)。
8. maxArea:最大的斑點(diǎn)面積,默認(rèn)為5000,表示只檢測(cè)面積小于5000的斑點(diǎn)。
9. filterByCircularity:是否根據(jù)斑點(diǎn)的圓形度進(jìn)行過濾,默認(rèn)為false,表示不進(jìn)行過濾。
10. minCircularity:最小的斑點(diǎn)圓形度,默認(rèn)為0.8,表示只檢測(cè)圓形度大于0.8的斑點(diǎn)。
11. maxCircularity:最大的斑點(diǎn)圓形度,默認(rèn)為1,表示只檢測(cè)圓形度小于1的斑點(diǎn)。
12. filterByInertia:是否根據(jù)斑點(diǎn)的慣性比進(jìn)行過濾,默認(rèn)為true,表示進(jìn)行過濾。
13. minInertiaRatio:最小的斑點(diǎn)慣性比,默認(rèn)為0.1,表示只檢測(cè)慣性比大于0.1的斑點(diǎn)。
14. maxInertiaRatio:最大的斑點(diǎn)慣性比,默認(rèn)為1,表示只檢測(cè)慣性比小于1的斑點(diǎn)。
15. filterByConvexity:是否根據(jù)斑點(diǎn)的凸度進(jìn)行過濾,默認(rèn)為true,表示進(jìn)行過濾。
16. minConvexity:最小的斑點(diǎn)凸度,默認(rèn)為0.95,表示只檢測(cè)凸度大于0.95的斑點(diǎn)。
17. maxConvexity:最大的斑點(diǎn)凸度,默認(rèn)為1,表示只檢測(cè)凸度小于1的斑點(diǎn)。
這些參數(shù)可以根據(jù)具體應(yīng)用場(chǎng)景進(jìn)行調(diào)整,以得到符合要求的斑點(diǎn)檢測(cè)結(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);
// 檢測(cè)斑點(diǎn)
KeyPoint[] keypoints = detector.Detect(image);
// 在圖像上繪制斑點(diǎn)
Mat result = new Mat();
Cv2.DrawKeypoints(image, keypoints, result, Scalar.All(-1), DrawMatchesFlags.Default);
// 顯示結(jié)果
Cv2.ImShow("Result", result);
Cv2.WaitKey(0);
二、邊緣檢測(cè)
邊緣檢測(cè)是一種圖像處理技術(shù),可以找到圖像中的邊緣或邊界。penCV 中提供的兩種重要邊緣檢測(cè)算法:Sobel邊緣檢測(cè)和 canny邊緣檢測(cè)。
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:輸出圖像,是一個(gè)與輸入圖像相同大小和類型的圖像。
ddepth:輸出圖像的深度,通常使用-1表示與輸入圖像相同深度。
dx:表示在水平方向上進(jìn)行邊緣檢測(cè)的階數(shù)。
dy:表示在垂直方向上進(jìn)行邊緣檢測(cè)的階數(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)行邊緣檢測(cè),通過調(diào)整dx和dy的值可以獲得不同方向的邊緣信息。輸出圖像的像素值表示了對(duì)應(yīng)位置的邊緣強(qiáng)度。
cv2.Sobel函數(shù)進(jìn)行邊緣檢測(cè)的示例
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);
這個(gè)示例將輸入圖像轉(zhuǎn)換為灰度圖像,并使用Sobel算子在水平方向上進(jìn)行邊緣檢測(cè),然后顯示結(jié)果圖像。
總之,cv2.Sobel函數(shù)是OpenCVSharp庫中的一個(gè)函數(shù),用于在圖像上應(yīng)用Sobel算子進(jìn)行邊緣檢測(cè)。通過調(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)行邊緣檢測(cè)的輸入圖像。
edges:輸出的邊緣圖像。
threshold1:第一個(gè)閾值,用于邊緣鏈接。
threshold2:第二個(gè)閾值,用于邊緣鏈接。
apertureSize:Sobel算子的孔徑大小,默認(rèn)為3。
L2gradient:一個(gè)布爾值,指定求梯度大小的方法,默認(rèn)為false。
Canny邊緣檢測(cè)算法的原理是:首先對(duì)圖像進(jìn)行高斯濾波,然后通過Sobel算子計(jì)算圖像的梯度,再通過非極大值抑制來提取局部最大值作為邊緣點(diǎn),最后通過雙閾值檢測(cè)來連接邊緣點(diǎn)。
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邊緣檢測(cè)算法檢測(cè)邊緣
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();
}
}這個(gè)示例代碼從文件中讀取圖像,然后將其轉(zhuǎn)換為灰度圖像。然后,它使用Canny邊緣檢測(cè)算法檢測(cè)圖像中的邊緣,并將結(jié)果顯示出來。最后,釋放內(nèi)存并關(guān)閉窗口。
注意:在運(yùn)行此代碼之前,確保已在項(xiàng)目中添加對(duì)OpenCVSharp庫的引用,并將圖像文件與示例代碼放在同一目錄下,并將圖像文件名替換為實(shí)際的圖像文件名
三、 輪廓檢測(cè)
輪廓檢測(cè)是一種從圖像中提取物體形狀的技術(shù)。OpenCV中的cvFindContours函數(shù)可以實(shí)現(xiàn)輪廓檢測(cè)。該函數(shù)將圖像轉(zhuǎn)換為二進(jìn)制圖像,然后找到所有的輪廓。
輪廓檢測(cè)步驟
- 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); // 對(duì)圖像進(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實(shí)現(xiàn)常見檢測(cè)(斑點(diǎn)檢測(cè),輪廓檢測(cè),邊緣檢測(cè))的詳細(xì)內(nèi)容,更多關(guān)于c# OpenCvSharp的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#?Unity使用正則表達(dá)式去除部分富文本的代碼示例
正則表達(dá)式在我們?nèi)粘i_發(fā)中的用處不用多說了吧,下面這篇文章主要給大家介紹了關(guān)于C#?Unity使用正則表達(dá)式去除部分富文本的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
c# DataView.ToTable()方法 去除表的重復(fù)項(xiàng)問題
這篇文章主要介紹了c# DataView.ToTable()方法 去除表的重復(fù)項(xiàng)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
將文件夾下所有文件輸出到日志文件中 c#遞歸算法學(xué)習(xí)示例
這篇文章主要介紹了將文件夾下所有文件輸出到日志文件中,通過這個(gè)示例我們學(xué)習(xí)一下遞歸算法的使用方法2014-01-01
C# SortedList排序列表的實(shí)現(xiàn)
本文主要介紹了C# SortedList排序列表的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

