• OpenCV之形态学操作


    形态学操作包含以下操作:

    • 腐蚀 (Erosion)
    • 膨胀 (Dilation)
    • 开运算 (Opening)
    • 闭运算 (Closing)
    • 形态梯度 (Morphological Gradient)
    • 顶帽 (Top Hat)黑帽(Black Hat)

    其中腐蚀和膨胀操作是最基本的操作,其他操作由这两个操作变换而来。

    腐蚀

            用一个结构元素扫描图像中每一个像素,结构元素中的每一个像素与其覆盖像素与操作,都为1,则该像素为1,否则为0,腐蚀的作用是消除物体边界点,消除小于结构元素的噪声点。

    1. void erode( InputArray src, OutputArray dst, InputArray kernel,
    2. Point anchor = Point(-1,-1), int iterations = 1,
    3. int borderType = BORDER_CONSTANT,
    4. const Scalar& borderValue = morphologyDefaultBorderValue() );

    src,dst:输入输出图像,可以相同;

    kernel:结构元素,一般使用Ma来确定结构元素;

    anchor:结构元素的描点;

    iterations:操作次数;

    borderType:边界类型;

    borderValue:边界值,当borderType=BORDER_CONSTANT时有效;

    实例:

    1. Mat kernal = Mat::ones(3,3,CV_8UC1);
    2. kernal.at<uchar>(0,1) = 0;
    3. kernal.at<uchar>(1,1) = 0;
    4. kernal.at<uchar>(2,1) = 0;
    5. cv::erode(_src,_src,kernal,Point(-1,-1),3);

                                                                            原始图像 

     

                                                                            腐蚀图像 

    膨胀

    1. void dilate( InputArray src, OutputArray dst, InputArray kernel,
    2. Point anchor = Point(-1,-1), int iterations = 1,
    3. int borderType = BORDER_CONSTANT,
    4. const Scalar& borderValue = morphologyDefaultBorderValue() );

    参数意义与腐蚀完全相同

    实例

    1. Mat kernal = Mat::ones(3,3,CV_8UC1);
    2. kernal.at<uchar>(1,0) = 0;
    3. kernal.at<uchar>(1,1) = 0;
    4. kernal.at<uchar>(1,2) = 0;
    5. cv::dilate(_src,_src,kernal,Point(-1,-1),3);

    膨胀图像

    开运算

            开运算是先腐蚀后膨胀,作用是分离物体,消除小区域,消除噪点,而不影响原来图像

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

    其中op设置为MORPH_OPEN

    实例:

    1. Mat kernal = Mat::ones(3,3,CV_8UC1);
    2. cv::morphologyEx(src,src,MORPH_OPEN,kernal,Point(-1,-1),2);

    原图:

    开运算后的图像:

     闭运算

    闭运算是先膨胀后腐蚀,作用是消除闭合物体里面的孔洞,可以填充闭合区域。

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

    其中op设置为MORPH_CLOSE

    形态梯度

            膨胀图与腐蚀图之差,能够保留物体的边缘轮廓。

     cv.morphologyEx(img,cv.MORPH_TOPHAT)

    礼帽运算

            原图像与开运算的结果差,开运算放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,操作和选择的核的大小相关。礼帽运算用来分离比邻近点亮一些的斑块。 当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

     cv.morphologyEx(img,cv.MORPH_TOPHAT)

    黑帽运算

            闭运算的结果图与原图像之差,闭运算填充了裂缝或者扩大局部高亮度的区域,因此,从结果图中减去原图后,得到的效果图突出了比原图区域更暗的区域,且这一操作和选择的核的大小相关,黑帽运算用来分离比邻近点暗一些的斑块。

     cv.morphologyEx(img,cv.MORPH_BLACKHAT)

  • 相关阅读:
    高速串行信号串接电容放在发送端还是接收端
    IProgress not found.Please update jupyter and ipywidgets.解决办法
    架构-三层架构:三层架构
    【问题思考总结】为什么非齐次方程的解是齐次通解加上一个非齐次特解?
    Dnsmasq的使用
    vue添加全局的 loading 加载图标,或者点击按钮之后禁用按钮
    Win11开机提示音要怎么改?
    【数据结构】AVL树(C++实现)
    iotdb优化
    Java项目依赖释放模式
  • 原文地址:https://blog.csdn.net/hulinhulin/article/details/132732266