博客
关于我
Opencv学习笔记之八——形态学处理(二)
阅读量:798 次
发布时间:2023-04-15

本文共 2356 字,大约阅读时间需要 7 分钟。

OpenCV形态学操作详解

1. 开运算

开运算(Opening Operation)是形态学中常见的一种操作,其核心思想是“先腐蚀后膨胀”。这种操作通常用于消除小物体或细小裂缝,同时保持物体的主要面积不变。

开运算的数学表达式可以表示为:[ \text{开运算} = \text{腐蚀}(\text{膨胀}(\text{原图})) ]从图像处理的角度来看,开运算可以用来:

  • 消除图像中的小物体
  • 在细小区域分离物体
  • 平滑大物体的边界
  • 2. 闭运算

    闭运算(Closing Operation)则是形态学中另一种重要的操作,其过程是“先膨胀后腐蚀”。这种操作通常用于填平图像中的小孔或“黑洞”。

    闭运算的数学表达式为:[ \text{闭运算} = \text{膨胀}(\text{腐蚀}(\text{原图})) ]闭运算的主要作用包括:

  • 填补图像中的小孔或黑洞
  • 平滑图像的边缘,减少噪声
  • 3. 形态学梯度

    形态学梯度(Morphological Gradient)是膨胀图与腐蚀图的差值,常用于提取图像的边缘信息。其数学表达式为:[ \text{形态学梯度} = \text{膨胀图} - \text{腐蚀图} ]这种操作可以用来突出图像中的边缘轮廓,特别是在二值图像中,形态学梯度可以很好地保留物体的轮廓边缘。

    4. 顶帽变换

    顶帽变换(Top Hat)又被称为“礼帽”变换,其运算结果为原图像与开运算结果的差值。具体来说:[ \text{顶帽} = \text{原图} - \text{开运算}(\text{原图}) ]顶帽变换的作用是突出图像中的亮斑区域,常用于背景提取,特别是在图像中存在明显背景时,顶帽变换可以帮助分离出较小的物体区域。

    5. 黑帽变换

    黑帽变换(Black Hat)则是闭运算结果与原图像的差值,数学表达式为:[ \text{黑帽} = \text{闭运算}(\text{原图}) - \text{原图} ]黑帽变换的作用是突出图像中的暗斑区域,常用于分离出较暗的物体区域。

    morphologyEx函数详解

    OpenCV中的morphologyEx函数是一个通用的形态学操作函数,其函数原型为:

    void morphologyEx(    InputArray src,    OutputArray dst,    int op,    InputArray kernel,    Point anchor = Point(-1, -1),    int iterations = 1,    int borderType = BORDER_CONSTANT,    const Scalar& borderValue = morphologyDefaultBorderValue());

    参数说明:

  • src: 输入图像,需为Mat类型,支持CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
  • dst: 输出图像,与src尺寸和类型一致。
  • op: 操作类型,可选值包括:
    • MORPH_OPEN:开运算
    • MORPH_CLOSE:闭运算
    • MORPH_GRADIENT:形态学梯度
    • MORPH_TOPHAT:顶帽变换
    • MORPH_BLACKHAT:黑帽变换
  • kernel: 形态学操作的内核,若为NULL则使用默认3x3的结构元素。
  • anchor: 锚点位置,默认为(-1, -1),表示中心对齐。
  • iterations: 迭代次数,默认为1。
  • borderType: 边界类型,默认为BORDER_CONSTANT。
  • borderValue: 常数边界值,默认调用morphologyDefaultBorderValue()获取。
  • 内核类型:

    getStructuringElement函数用于获取结构化元素(内核),支持以下类型:

    • MORPH_RECT:矩形
    • MORPH_CROSS:十字形
    • MORPH_ELLIPSE:椭圆形

    使用注意事项:

  • anchor的位置会影响操作结果,尤其在非中心对齐的情况下。
  • iterations越大,操作效果越明显,但也可能导致性能问题。
  • borderType的处理需要根据具体应用需求选择合适的边界模式。
  • 代码实现示例

    以下是一个使用morphologyEx函数进行形态学操作的示例代码:

    #include 
    using namespace cv;int main() { // 读取输入图像 Mat src = imread("test_image.jpg"); if (src.empty()) { return 0; } // 初始化输出图像 Mat dst = src.clone(); // 设置形态学操作类型为开运算 int op = MORPH_OPEN; // 使用3x3的结构元素 Mat kernel = getStructuringElement(MORPH_CROSS, 3, 3); // 进行形态学操作 morphologyEx(src, dst, op, kernel, Point(-1, -1), 2, BORDER_REPLICATE); // 保存结果 imwrite("result.jpg", dst); return 0;}

    运算效果对比

    以下是不同形态学操作的效果对比图:

  • 开运算:效果图1
  • 闭运算:效果图2
  • 顶帽变换:效果图3
  • 黑帽变换:效果图4
  • 形态学梯度:效果图5
  • 通过以上代码和示例,可以清晰地看到不同形态学操作对图像的影响,从而更好地掌握图像处理的需求。

    转载地址:http://kwgfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql 笔记
    查看>>
    MySQL 精选 60 道面试题(含答案)
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>
    mysql 视图,视图更新删除
    查看>>