OpenCV-python形态学及图像的开闭运算

形态学图像处理的基本运算有:

  • 膨胀和腐蚀(膨胀区域填充,腐蚀分割区域)

  • 开运算和闭运算(开运算去除噪点,闭运算填充内部孔洞)

  • 击中与击不中

  • 顶帽变换,黑帽变换

形态学的应用:消除噪声、边界提取、区域填充、连通分量提取、凸壳、细化、粗化等;分割出独立的图像元素,或者图像中相邻的元素;求取图像中明显的极大值区域和极小值区域;求取图像梯度

知识重点

  • 二值化操作  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),对灰度图像操作,  全局阈值,整幅图像采用同一个数作为阈值 。
  • 自适应阈值二值化  dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 7)  此时的阈值是根据图像上的每一个小区域计算与其对应的阈值 。

  • 腐蚀操作  dst = cv2.erode(img, kernel, iterations = 2)  腐蚀操作也是用卷积核扫描图像, 去除图片中的噪点, 只不过腐蚀操作的卷积和一般都是1, 如果卷积核内所有像素点都是白色, 那么锚点即为白色. iterations是腐蚀操作的迭代次数, 次数越多, 腐蚀效果越明显 。
    • getStructuringElement(shape, ksize[, anchor])  opencv提供了获取卷积核的api.不需要我们手工创建卷积核.shape是指卷积核的形状, 注意不是指长宽, 是指卷积核中1形成的形状.

  • 膨胀操作  dst = cv2.dilate(img, kernel, iterations = 1)  实现对图像的膨胀操作
  • 开运算  dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)  开运算 = 腐蚀 + 膨胀  去除图像外部的噪点 .
  • 闭运算  dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)  闭运算 = 膨胀 + 腐蚀  填充图像内部的噪点 .
  • 形态学梯度  dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)  梯度 = 原图 - 腐蚀, 腐蚀之后原图边缘变小了, 原图 - 腐蚀 就可以得到腐蚀掉的部分, 即边缘.
  • 顶帽运算  dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel,iterations = 2)  顶帽 = 原图 - 开运算  开运算的效果是去除图像外的噪点, 原图 - 开运算就得到了去掉的噪点.
  • 黑帽操作  dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel,iterations = 2) 
    • 黑帽 = 原图 - 闭运算  闭运算可以将图形内部的噪点去掉, 那么原图 - 闭运算的结果就是图形内部的噪点
    Mat kernel = getStructuringElement(int shape,Size ksize,Point anchor);
    shape   //结构元素的定义:形状 (MORPH_RECT \MORPH_CROSS(交叉形) \MORPH_ELLIPSE);
    ksize   //结构元素大小;
    anchor  //锚点 默认是Point(-1, -1)意思就是中心像素,也可以自己指定

    高阶形态学变换

    复制代码
    void morphologyEx(
          InputArray src,            //输入图像
         OutputArray dst,            //输出图像
                  int op,            //形态学运算类型
        InputArray kernel,           //结构元素
        Point anchor = Point(-1,-1), //锚点
        int iterations = 1,          //运算次数
        int borderType = BORDER_CONSTANT,
                      )
    复制代码

    对于输入参数op(形态学运算类型)有以下几种参数可以设置:

    • MORPH_ERODE(腐蚀)

    • MORPH_DILATE(膨胀)

    • MORPH_OPEN(开运算)

    • MORPH_CLOSE(闭运算)

    • MORPH_GRADIENT(形态学梯度,即膨胀图减腐蚀图)

    • MORPH_TOPHAT(顶帽运算)

    • MORPH_BLACKHAT(底帽运算)

    • MORPH_HITMISS(击中与击不中)

     

    顶帽运算就是图与原图的开运算的差值图像。作用:

    1️⃣:得到开运算消除的区域(检查开运算效果)

    2️⃣:校正不均匀光照的影响(用于暗背景上的亮物体,去光差)

     Mat src1 = imread("D:/opencv练习图片/开运算.png");
        Mat src_open, src_tophat;
        imshow("原图", src1);
        Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
        morphologyEx(src1, src_open, MORPH_OPEN, kernel,Point(-1, -1));//开运算
        morphologyEx(src1, src_tophat, MORPH_TOPHAT, kernel, Point(-1, -1));//顶帽运算
        imshow("开运算", src_open);
        imshow("顶帽运算", src_tophat);

     

    Mat src1 = imread("D:/opencv练习图片/闭运算.png");
        Mat src_close, src_blackhat;
        imshow("原图", src1);
        Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
        morphologyEx(src1, src_close, MORPH_CLOSE, kernel,Point(-1, -1));//闭运算
        morphologyEx(src1, src_blackhat, MORPH_BLACKHAT, kernel, Point(-1, -1));//底帽运算
        imshow("闭运算", src_close);
        imshow("底帽运算", src_blackhat);

     

    底帽运算就是图与原图的闭运算的差值图像。作用:

    1️⃣:闭运算是去噪点的过程,所以黑帽操作实质上保留的是噪点的部分。

    2️⃣:校正不均匀光照的影响(用于亮(白)背景上的暗物体)

     

     

     

     

posted @   hotzhml  阅读(117)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示