C#:OpenCvSharp梳理3(檢測)

  • OpenCvSharp安裝(一)
  • OpenCvSharp讀取、顯示和寫入圖像(二)
  • OpenCvSharp圖像裁剪、調(diào)整大小、旋轉(zhuǎn)、透視(三)
  • OpenCvSharp基本繪畫(直線、橢圓、矩形、圓、多邊形、文本)(四)
  • OpenCvSharp 檢測(斑點檢測、邊緣檢測、輪廓檢測)(五)
  • OpenCvSharp 輪廓繪制六步驟(六)
  • OpenCvSharp 目標(biāo)檢測五個步驟(七)
  • OpenCvSharp透視矯正六步驟(八)

五 、檢測(斑點檢測、邊緣檢測、輪廓檢測)

進行圖像處理時,可以使用不同的算法和函數(shù)來實現(xiàn)斑點檢測、邊緣檢測和輪廓檢測。

1、斑點檢測(Blob)

1)、SimpleBlobDetector

  • 斑點檢測是指在圖像中找到明亮或暗的小區(qū)域(通常表示為斑點),并標(biāo)記它們的位置。
    可以使用OpenCV中的函數(shù)SimpleBlobDetector來實現(xiàn)斑點檢測。
    該函數(shù)將圖像轉(zhuǎn)換為二進制圖像,然后找到所有的輪廓,通過設(shè)置閾值來確定斑點的亮度范圍。

  • SimpleBlobDetector是OpenCV中用于檢測二值圖像中的斑點的類,以下是它的參數(shù)說明:

      1. thresholdStep:二值化閾值步長,用于在二值化過程中逐步增加或減小閾值,默認(rèn)為10。
      1. minThreshold:最小的二值化閾值,默認(rèn)為50。
      1. maxThreshold:最大的二值化閾值,默認(rèn)為220。
      1. minRepeatability:最小的斑點重復(fù)次數(shù),默認(rèn)為2,表示只有當(dāng)一個斑點至少在兩個不同位置被檢測到時才會被認(rèn)為是有效的。
      1. blobColor:斑點的亮度值,取值為0或255,默認(rèn)為0,表示只檢測黑色斑點。
      1. filterByArea:是否根據(jù)斑點的面積進行過濾,默認(rèn)為true,表示進行過濾。
      1. minArea:最小的斑點面積,默認(rèn)為25,表示只檢測面積大于25的斑點。
      1. maxArea:最大的斑點面積,默認(rèn)為5000,表示只檢測面積小于5000的斑點。
      1. filterByCircularity:是否根據(jù)斑點的圓形度進行過濾,默認(rèn)為false,表示不進行過濾。
      1. minCircularity:最小的斑點圓形度,默認(rèn)為0.8,表示只檢測圓形度大于0.8的斑點。
      1. maxCircularity:最大的斑點圓形度,默認(rèn)為1,表示只檢測圓形度小于1的斑點。
      1. filterByInertia:是否根據(jù)斑點的慣性比進行過濾,默認(rèn)為true,表示進行過濾。
      1. minInertiaRatio:最小的斑點慣性比,默認(rèn)為0.1,表示只檢測慣性比大于0.1的斑點。
      1. maxInertiaRatio:最大的斑點慣性比,默認(rèn)為1,表示只檢測慣性比小于1的斑點。
      1. filterByConvexity:是否根據(jù)斑點的凸度進行過濾,默認(rèn)為true,表示進行過濾。
      1. minConvexity:最小的斑點凸度,默認(rèn)為0.95,表示只檢測凸度大于0.95的斑點。
      1. maxConvexity:最大的斑點凸度,默認(rèn)為1,表示只檢測凸度小于1的斑點。
// 讀取原始圖像
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);

2)、connectedComponentsWithStats

  • 使用cv2.connectedComponentsWithStats找到所有連通區(qū)域及其統(tǒng)計數(shù)據(jù)。
    過濾出可能是斑點的連通區(qū)域。
using OpenCvSharp.Blob;

                Cv2.Threshold(bin, binary, 90, 255, ThresholdTypes.Binary); //二值化

                Mat result = new Mat(my_img3.Size(), MatType.CV_8UC3);
                CvBlobs blobs = new CvBlobs();

                blobs.Label(binary);//斑點檢測
                blobs.RenderBlobs(my_img3, result);//渲染斑點

                int text = 1; //數(shù)字
                foreach (var item in blobs)
                {

                    if ((item.Value.Area > 20))  // 檢查標(biāo)簽區(qū)域 20
                    {
                        // float xxx=item.Value.
                        CvBlob b = item.Value;

                        Cv2.Circle(result, b.Contour.StartingPoint, 8, Scalar.Red, 2, LineTypes.AntiAlias);
                        Cv2.PutText(result, text.ToString(), new OpenCvSharp.Point(b.Centroid.X, b.Centroid.Y),  //修改標(biāo)簽編號設(shè)置
                            HersheyFonts.HersheyComplex, 1, Scalar.Yellow, 2, LineTypes.AntiAlias);
                        int ratio = 100 * b.Area / (b.Rect.Width * b.Rect.Height);
                        // if (b.Area / (b.Rect.Width * b.Rect.Height) > 0.4)
                        //  {
                        LogHelper.WriteLog("ratio=" + ratio.ToString() + ",Area=" + b.Area.ToString() + "Width=" + b.Rect.Width.ToString() + "Height=" + b.Rect.Height.ToString());
                        if (ratio >= 40)
                        { ZpArr[i] = 0; }

                        //   }
                        text++;
                    }
                }

2、邊緣檢測

  • 邊緣檢測是一種圖像處理技術(shù),可以找到圖像中的邊緣或邊界。
    OpenCV 中提供的兩種重要邊緣檢測算法:Sobel邊緣檢測和 canny邊緣檢測。

1)、cv2.Sobel()

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:表示卷積核的大小,默認(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ù)可以進行邊緣檢測,通過調(diào)整dx和dy的值可以獲得不同方向的邊緣信息。輸出圖像的像素值表示了對應(yīng)位置的邊緣強度。
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é)果圖像。

2)、cv2.Canny()

public static void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)


3、輪廓檢測

  • 輪廓檢測是一種從圖像中提取物體形狀的技術(shù)。
    OpenCV中的cvFindContours函數(shù)可以實現(xiàn)輪廓檢測。
    該函數(shù)將圖像轉(zhuǎn)換為二進制圖像,然后找到所有的輪廓。

參考

李建軍的博客:https://blog.csdn.net/hb_ljj/article/details/135038353
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容