C#:OpenCvSharp梳理3(检测)

  • OpenCvSharp安装(一)
  • OpenCvSharp读取、显示和写入图像(二)
  • OpenCvSharp图像裁剪、调整大小、旋转、透视(三)
  • OpenCvSharp基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)
  • OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)
  • OpenCvSharp 轮廓绘制六步骤(六)
  • OpenCvSharp 目标检测五个步骤(七)
  • OpenCvSharp透视矫正六步骤(八)

五 、检测(斑点检测、边缘检测、轮廓检测)

进行图像处理时,可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。

1、斑点检测(Blob)

1)、SimpleBlobDetector

  • 斑点检测是指在图像中找到明亮或暗的小区域(通常表示为斑点),并标记它们的位置。
    可以使用OpenCV中的函数SimpleBlobDetector来实现斑点检测。
    该函数将图像转换为二进制图像,然后找到所有的轮廓,通过设置阈值来确定斑点的亮度范围。

  • SimpleBlobDetector是OpenCV中用于检测二值图像中的斑点的类,以下是它的参数说明:

      1. thresholdStep:二值化阈值步长,用于在二值化过程中逐步增加或减小阈值,默认为10。
      1. minThreshold:最小的二值化阈值,默认为50。
      1. maxThreshold:最大的二值化阈值,默认为220。
      1. minRepeatability:最小的斑点重复次数,默认为2,表示只有当一个斑点至少在两个不同位置被检测到时才会被认为是有效的。
      1. blobColor:斑点的亮度值,取值为0或255,默认为0,表示只检测黑色斑点。
      1. filterByArea:是否根据斑点的面积进行过滤,默认为true,表示进行过滤。
      1. minArea:最小的斑点面积,默认为25,表示只检测面积大于25的斑点。
      1. maxArea:最大的斑点面积,默认为5000,表示只检测面积小于5000的斑点。
      1. filterByCircularity:是否根据斑点的圆形度进行过滤,默认为false,表示不进行过滤。
      1. minCircularity:最小的斑点圆形度,默认为0.8,表示只检测圆形度大于0.8的斑点。
      1. maxCircularity:最大的斑点圆形度,默认为1,表示只检测圆形度小于1的斑点。
      1. filterByInertia:是否根据斑点的惯性比进行过滤,默认为true,表示进行过滤。
      1. minInertiaRatio:最小的斑点惯性比,默认为0.1,表示只检测惯性比大于0.1的斑点。
      1. maxInertiaRatio:最大的斑点惯性比,默认为1,表示只检测惯性比小于1的斑点。
      1. filterByConvexity:是否根据斑点的凸度进行过滤,默认为true,表示进行过滤。
      1. minConvexity:最小的斑点凸度,默认为0.95,表示只检测凸度大于0.95的斑点。
      1. maxConvexity:最大的斑点凸度,默认为1,表示只检测凸度小于1的斑点。
// 读取原始图像
Mat image = new Mat("1.jpg", ImreadModes.Color);
 
// 创建SimpleBlobDetector参数
SimpleBlobDetector.Params parameters = new SimpleBlobDetector.Params();
 
// 设置参数
parameters.FilterByArea = true;
parameters.MinArea = 100;
parameters.MaxArea = 10000;
 
// 创建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);
 
// 显示结果
Cv2.ImShow("Result", result);
Cv2.WaitKey(0);

2)、connectedComponentsWithStats

  • 使用cv2.connectedComponentsWithStats找到所有连通区域及其统计数据。
    过滤出可能是斑点的连通区域。
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; //数字
                foreach (var item in blobs)
                {

                    if ((item.Value.Area > 20))  // 检查标签区域 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),  //修改标签编号设置
                            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、边缘检测

  • 边缘检测是一种图像处理技术,可以找到图像中的边缘或边界。
    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
)

参数说明:

  • src:输入图像。
    dst:输出图像,是一个与输入图像相同大小和类型的图像。
    ddepth:输出图像的深度,通常使用-1表示与输入图像相同深度。
    dx:表示在水平方向上进行边缘检测的阶数。
    dy:表示在垂直方向上进行边缘检测的阶数。
    ksize:表示卷积核的大小,默认为3。
    scale:可选参数,用于缩放结果,默认为1。
    delta:可选参数,用于调整结果的偏移,默认为0。
    borderType:可选参数,用于指定边界的处理方式,默认为BorderType.Default。
  • 使用cv2.Sobel函数可以进行边缘检测,通过调整dx和dy的值可以获得不同方向的边缘信息。输出图像的像素值表示了对应位置的边缘强度。
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);
 
  • 这个示例将输入图像转换为灰度图像,并使用Sobel算子在水平方向上进行边缘检测,然后显示结果图像。

2)、cv2.Canny()

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


3、轮廓检测

  • 轮廓检测是一种从图像中提取物体形状的技术。
    OpenCV中的cvFindContours函数可以实现轮廓检测。
    该函数将图像转换为二进制图像,然后找到所有的轮廓。

参考

李建军的博客:https://blog.csdn.net/hb_ljj/article/details/135038353
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容