亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c# OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測)

 更新時間:2023年12月28日 10:59:31   作者:李建軍  
這篇文章主要為大家詳細(xì)介紹了c#如何使用OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測),文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下

在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á)式去除部分富文本的代碼示例

    C#?Unity使用正則表達(dá)式去除部分富文本的代碼示例

    正則表達(dá)式在我們?nèi)粘i_發(fā)中的用處不用多說了吧,下面這篇文章主要給大家介紹了關(guān)于C#?Unity使用正則表達(dá)式去除部分富文本的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • C#特性 迭代器(下) yield以及流的延遲計算

    C#特性 迭代器(下) yield以及流的延遲計算

    這篇文章主要介紹了C#特性 迭代器(下) yield以及流的延遲計算,需要的朋友可以參考下
    2014-12-12
  • C#操作XML方法詳解

    C#操作XML方法詳解

    對于XML讀寫操作,項目中經(jīng)常要用到,之前木有好好總結(jié)過,例如LINQ TO XML也用過,這篇文章主要介紹了C#操作XML的方法
    2021-11-11
  • FileStream常用的屬性與方法總結(jié)

    FileStream常用的屬性與方法總結(jié)

    本篇文章主要是對FileStream常用的屬性與方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#通過抽象工廠模式造車

    C#通過抽象工廠模式造車

    這篇文章介紹了C#通過抽象工廠模式造車的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • C#中的委托和事件

    C#中的委托和事件

    這篇文章介紹了C#中的委托和事件,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • c# DataView.ToTable()方法 去除表的重復(fù)項問題

    c# DataView.ToTable()方法 去除表的重復(fù)項問題

    這篇文章主要介紹了c# DataView.ToTable()方法 去除表的重復(fù)項問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 將文件夾下所有文件輸出到日志文件中 c#遞歸算法學(xué)習(xí)示例

    將文件夾下所有文件輸出到日志文件中 c#遞歸算法學(xué)習(xí)示例

    這篇文章主要介紹了將文件夾下所有文件輸出到日志文件中,通過這個示例我們學(xué)習(xí)一下遞歸算法的使用方法
    2014-01-01
  • c# dynamic的使用詳解

    c# dynamic的使用詳解

    這篇文章主要介紹了c# dynamic的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C# SortedList排序列表的實現(xiàn)

    C# SortedList排序列表的實現(xiàn)

    本文主要介紹了C# SortedList排序列表的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論