OpenCV 形态学

这篇具有很好参考价值的文章主要介绍了OpenCV 形态学。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

形态学处理

形态学处理之前需要将图像进行二值化处理, 然后我们需要设定一个卷积核, 最后将像素上每个点都完成卷积计算.
形态学很多高级处理的基础, 有很多作用: 消除毛刺、填充空隙、检测边缘,检查拐角(使用十字形卷积核)

腐蚀 Erode

腐蚀作用和膨胀相反, 用来腐蚀减小白色区域, 常用来消除一些白色毛刺等细小区域, 也会腐蚀掉边缘部分.
卷积计算方法: 卷积核为一个全1的小矩阵, 计算过程为, 图像一个像素和卷积核对齐后, 如果卷积覆盖区域中图像有含0的像素, 则该像素取值为0, 即白色, 如果全部都为1, 则该像素值为1.

代码示例:

public void erodeTest()
{
    string file = @"D:\my_workspace\opencv\images\毛刺.jpg";
    var img = Cv2.ImRead(file, ImreadModes.Grayscale);
    var elements = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));
    var newImg1 = img.Clone();
    newImg1 = newImg1.Erode(elements, null, iterations: 1);

    Cv2.ImShow("img", img);
    Cv2.ImShow("腐蚀1次", newImg1);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

效果:OpenCV 形态学,opencv,计算机视觉,人工智能

膨胀 Dilate

膨胀用来扩张白色区域, 减少黑色区域, 常用来消除区域中的黑色空隙, 也会扩大白色边缘部分.
卷积计算方法: 卷积核为一个全1的小矩阵, 计算过程为, 图像一个像素和卷积核对齐后, 如果卷积覆盖区域中图像有含1的像素, 则该像素取值为1, 即白色, 如果全部都为0, 则该像素值为0.

/// <summary>
/// 膨胀测试
/// 结论: 3次递归, 仍有少量空隙, 这时可增加递归次数, 或者增大卷积核size
/// </summary>
public void dilateTest()
{
    string file = @"D:\my_workspace\opencv\images\孔隙.jpg";
    var img = Cv2.ImRead(file, ImreadModes.Grayscale);
    var elements = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));
    var newImg3 = img.Clone();
    newImg3 = newImg3.Dilate(elements, null, iterations: 3); //3次递归, 仍有少量空隙, 这时可增加递归次数, 或者增大卷积核size
    var newImg6 = img.Clone();
    newImg6 = newImg6.Dilate(elements, null, iterations: 6);  //6次递归, 空隙清除干净
    Cv2.ImShow("img", img);
    Cv2.ImShow("膨胀3次", newImg3);
    Cv2.ImShow("膨胀6次", newImg6);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

效果:
经过膨胀后, 空隙被消除了, 但可以看到矩形也变大了.OpenCV 形态学,opencv,计算机视觉,人工智能

开运算

开运算是先腐蚀后膨胀, 闭运算是先膨胀后腐蚀, 腐蚀和膨胀其实并不是逆运算, 所以开闭运算最终效果是不一样的.
我们使用开运算的主要目的是利用腐蚀的正向效果, 即消除毛刺和虚假联通部分, 同时使用膨胀来抵消腐蚀的副作用.

代码示例:

/// <summary>
/// 开运算, 先腐蚀后膨胀
/// </summary>
public void openTest()
{
    string file = @"D:\my_workspace\opencv\images\毛刺.jpg";
    var img = Cv2.ImRead(file, ImreadModes.Grayscale);
    var elements = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));
    var newImg1 = img.Clone();
    Cv2.MorphologyEx(newImg1, newImg1, MorphTypes.Open, elements, anchor: null, iterations: 1);
    Cv2.ImShow("img", img);
    Cv2.ImShow("开运算", newImg1);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

效果:OpenCV 形态学,opencv,计算机视觉,人工智能

闭运算

闭运算是先膨胀后腐蚀, 开运算是先腐蚀后膨胀, 腐蚀和膨胀其实并不是逆运算, 所以开闭运算最终效果是不一样的.
我们使用闭运算的主要目的是利用膨胀的正向效果, 同时使用腐蚀来抵消膨胀的副作用.

代码:

/// <summary>
/// 闭运算, 先膨胀后腐蚀
/// </summary>
public void closeTest()
{
    string file = @"D:\my_workspace\opencv\images\孔隙.jpg";
    var img = Cv2.ImRead(file, ImreadModes.Grayscale);
    var elements = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));
    var newImg1 = img.Clone();
    Cv2.MorphologyEx(newImg1, newImg1, MorphTypes.Close, elements, anchor: null, iterations: 4);
    Cv2.ImShow("img", img);
    Cv2.ImShow("闭运算", newImg1);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

效果:OpenCV 形态学,opencv,计算机视觉,人工智能

梯度 Gradient

梯度相当于膨胀后的图像减去腐蚀后的图像, 可以用来刻画出轮廓部分.

代码示例:

/// <summary>
/// 梯度: 膨胀-腐蚀
/// </summary>
public void gradientTest()
{
    string file = @"D:\my_workspace\opencv\images\circle.png";
    var img = Cv2.ImRead(file, ImreadModes.Grayscale);
    var newImg3 = img.Clone();
    var elements3 = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));
    Cv2.MorphologyEx(newImg3, newImg3, MorphTypes.Gradient, elements3, anchor: null, iterations: 1);
    var newImg5 = img.Clone();
    var elements5 = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(5, 5));
    Cv2.MorphologyEx(newImg5, newImg5, MorphTypes.Gradient, elements5, anchor: null, iterations: 1);
    Cv2.ImShow("img", img);
    Cv2.ImShow("梯度3", newImg3);
    Cv2.ImShow("梯度5", newImg5);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

效果:OpenCV 形态学,opencv,计算机视觉,人工智能

礼帽和顶帽 Top Hat

礼帽也叫做顶帽 Top Hat: 原始图像-开运算, 能将一些细小的毛刺凸显出来
黑帽 Black Hat: 闭操作-原始图像, 能将一些黑色的空隙凸显出来.

代码示例:

/// <summary>
/// 礼帽(顶帽), 原始图像-开操作
/// </summary>
public void topHatTest()
{
    string file = @"D:\my_workspace\opencv\images\毛刺.jpg";
    var img = Cv2.ImRead(file, ImreadModes.Grayscale);
    var elements = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));
    var newImg1 = img.Clone();
    Cv2.MorphologyEx(newImg1, newImg1, MorphTypes.TopHat, elements, anchor: null, iterations: 1);
    Cv2.ImShow("img", img);
    Cv2.ImShow("礼帽(顶帽)", newImg1);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

效果:OpenCV 形态学,opencv,计算机视觉,人工智能

黑帽 Black Hat

黑帽 Black Hat: 闭操作-原始图像, 能将一些黑色的空隙凸显出来.
礼帽也叫做顶帽 Top Hat: 原始图像-开运算, 能将一些细小的毛刺凸显出来

代码示例:

/// <summary>
/// 黑帽运算, 闭操作-原始图像
/// </summary>
public void blackHatTest()
{
    string file = @"D:\my_workspace\opencv\images\孔隙.jpg";
    var img = Cv2.ImRead(file, ImreadModes.Grayscale);
    var elements = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3));
    var newImg1 = img.Clone();
    Cv2.MorphologyEx(newImg1, newImg1, MorphTypes.BlackHat, elements, anchor: null, iterations: 4);
    Cv2.ImShow("img", img);
    Cv2.ImShow("黑帽运算", newImg1);
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

效果演示:OpenCV 形态学,opencv,计算机视觉,人工智能

参考

https://zhuanlan.zhihu.com/p/273475106https://blog.csdn.net/Vermont_/article/details/108424547文章来源地址https://www.toymoban.com/news/detail-835568.html

到了这里,关于OpenCV 形态学的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCv之图像形态学

    目录 一、形态学  二、图像全局二值化  三、自适应阈值二值化 四、腐蚀操作 五、获取形态学卷积核 六、膨胀操作 七、开运算 八、闭运算 定义: 指一系列处理图像形状特征的图像处理技术 形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输入图

    2024年02月16日
    浏览(38)
  • Opencv-C++笔记 (5) : opencv-形态学

    形态学运算是针对二值图像依据数学形态学(Mathematical Morphology)的集合论方法发展起来的图像处理方法。数学形态学起源于岩相学对岩石结构的定量描述工作,近年来在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析方法和理论。 结构元素

    2024年02月09日
    浏览(48)
  • OpenCV(三十一):形态学操作

    ​​​​​​1.形态学操作        OpenCV 提供了丰富的函数来进行形态学操作,包括腐蚀、膨胀、开运算、闭运算等。下面介绍一些常用的 OpenCV 形态学操作函数: 腐蚀操作(Erosion): erode(src, dst, kernel, anchor, iterations, borderType, borderValue) 该函数对输入图像中的前景区域进行

    2024年02月09日
    浏览(52)
  • OpenCV17-图像形态学操作

    图像腐蚀(Image erosion)可用于减小图像中物体的大小、填充孔洞或者分离邻近的物体。腐蚀操作通过对图像中的每个像素应用结构元素(也称为腐蚀内核)来实现。 腐蚀操作的原理是将结构元素与图像进行逐像素的比较。如果结构元素的所有像素与图像中对应位置的像素都

    2024年02月08日
    浏览(50)
  • opencv获取形态学卷积核

    获取形态学卷积核,这个函数是用来创建自定义形状的卷积核(也称为结构元素),这些核可以用在形态学操作比如腐蚀和膨胀中。 cv2.getStructuringElement(shape, ksize[, anchor]) shape:卷积核形状, cv2.MORPH_RECT: 矩形结构元素 cv2.MORPH_CROSS: 交叉形结构元素 cv2.MORPH_ELLIPSE: 椭圆形结构元素

    2024年04月14日
    浏览(47)
  • 10 OpenCV 形态学的应用

    adaptiveThreshold 二值化算子 想法:把获取二值化的图片轮廓,对直线进行开闭运算

    2024年03月13日
    浏览(43)
  • OpenCv之图像形态学(二)

    目录 一、形态学梯度 二、顶帽操作 三、黑帽操作 梯度=原图 - 腐蚀 腐蚀之后原图边缘变小,原图 - 腐蚀 就可以得到腐蚀掉的部分,即边缘 案例代码如下: 运行结果如下: 顶帽 = 原图 - 开运算 开运算的效果是去除图形外的噪点,原图 - 开运算就得到了去掉的噪点 案例代码如

    2024年02月16日
    浏览(44)
  • OpenCV快速入门:图像形态学操作

    图像形态学是一门强大而有趣的技术,它通过对图像进行形态学操作,使图像更适合后续处理步骤。在本文中,我们将深入探讨OpenCV中的图像形态学操作,快速入门这一关键领域。 图像形态学作为数字图像处理的一个分支,致力于通过形态学操作实现对图像特征的提取、噪音

    2024年02月05日
    浏览(97)
  • Python轮廓追踪【OpenCV形态学操作】

    一些理论知识 OpenCV形态学操作理论1 OpenCV形态学操作理论2 OpenCV轮廓操作|轮廓类似详解 代码如下,可以直接运行

    2024年02月22日
    浏览(52)
  • Opencv | 图像卷积与形态学变换操作

    在每个图像位置(x,y)上进行基于邻域的函数计算,其中函数参数被称为卷积核 (kernel) kernel核的尺寸通常为奇数,一般为: 3 ∗ 3 、 5 ∗ 5 、 7 ∗ 7 3*3、5*5、7*7 3 ∗ 3 、 5 ∗ 5 、 7 ∗ 7 不同功能需要定义不同的函数,其中功能可以有: 图像增强:           平滑 / 去

    2024年04月23日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包