• OpenCV图像处理学习十一,图像开操作与闭操作


    一.开操作:

    开操作即为先腐蚀后膨胀。以单通道的黑白图像为例,先通过腐蚀操作,将黑色区域腐蚀扩大,再通过膨胀操作,将白色区域膨胀扩大。如果图像上有一个小白色像素点,先通过腐蚀操作,被周围的黑色像素点覆盖掉,再进行膨胀操作,去掉小的白色像素点。

    在二值图中,表现为去掉白色的小点或填充黑点

    形态学操作API函数接口:

    1. void cv::morphologyEx (     InputArray      src,
    2.                             OutputArray      dst,
    3.                             int      op,
    4.                             InputArray      kernel,
    5.                             Point      anchor = Point(-1,-1),
    6.                             int      iterations = 1,
    7.                             int      borderType = BORDER_CONSTANT,
    8.                             const Scalar & borderValue = morphologyDefaultBorderValue() 
    9.     )   
    10. 1)InputArray类型的src,输入图像。通道数可以任意,但深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64F之一。
    11. 2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。
    12. 3int类型的op,形态学操作的类型,请参见cv::MorphTypes
    13. 4)InputArray类型的kernel,用于膨胀的结构元素;如果elemenat=Mat(),则使用3 x 3矩形结构元素。可以使用getStructuringElement创建内核。
    14. 5)Point类型的anchor:锚定在元素中的位置;默认值(-1,-1)表示锚定在元素中心。
    15. 6int类型的iterations:应用膨胀的次数。
    16. 7int类型的borderType:像素外推方法,参见cv::BorderTypes。
    17. 8)Scalar类型的borderValue:恒定边框时的边框值。

    cv::MorphTypes结构体内容如下:

    1. enum MorphTypes{
    2. MORPH_ERODE = 0, //腐蚀
    3. MORPH_DILATE = 1, //膨胀
    4. MORPH_OPEN = 2, //开操作
    5. MORPH_CLOSE = 3, //闭操作
    6. MORPH_GRADIENT = 4, //梯度操作
    7. MORPH_TOPHAT = 5, //顶帽操作
    8. MORPH_BLACKHAT = 6, //黑帽操作
    9. };

    二.闭操作:

    闭操作即为先膨胀后腐蚀,以单通道的黑白图像为例,先通过膨胀操作,将白色区域膨胀扩大,再通过腐蚀操作,将黑色区域腐蚀扩大。一个小的黑色像素点,先通过膨胀操作,被周围的白色覆盖掉,再进行腐蚀操作,去除小的黑色像素点。也就是合适的闭操作,可以填充小对象。


     =========================================================================

    代码实现:

    1. #include"stdafx.h"
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. using namespace cv;
    7. int main()
    8. {
    9. Mat image1 = imread("F:/photo/qx.jpg", 1);
    10. namedWindow("input_picture1");
    11. imshow("input_picture1", image1);
    12. Mat image2;
    13. Mat image3;
    14. cvtColor(image1, image2, COLOR_RGB2GRAY);
    15. namedWindow("input_picture2");
    16. imshow("input_picture2", image2);
    17. threshold(image2, image3, 65, 255, THRESH_BINARY);
    18. namedWindow("input_picture3");
    19. imshow("input_picture3", image3);
    20. Mat dst;
    21. Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
    22. //开操作
    23. morphologyEx(image3, dst, CV_MOP_OPEN, kernel);
    24. imshow("open-src", dst);
    25. //闭操作
    26. morphologyEx(image3, dst, CV_MOP_CLOSE, kernel);
    27. imshow("close-src", dst);
    28. //形态学梯度
    29. //morphologyEx(image3, dst, CV_MOP_GRADIENT, kernel);
    30. //imshow("gradient-src", dst);
    31. //顶帽
    32. //morphologyEx(image3, dst, CV_MOP_TOPHAT, kernel);
    33. //imshow("tophat-src", dst);
    34. //黑帽
    35. //morphologyEx(image3, dst, CV_MOP_BLACKHAT, kernel);
    36. //imshow("blackhat-src", dst);
    37. waitKey(0);
    38. return 0;
    39. }

    图像处理效果:

    原图和灰度图片

    灰度图和二值化图

    图像开操作和闭操作

  • 相关阅读:
    最强总结!18个机器学习核心算法模型!!
    力扣练习——68 连续数组
    k8s_base
    个人健康管理系统 JAVA开源项目 毕业设计
    Linux——生产者消费者模型
    EDID详解
    flutter dio^5.3.3实现刷新token
    centos7安装tomcat9过程
    WorkPlus即时通讯app支持多种信创环境组合运行
    【推荐系统】:协同过滤和基于内容过滤概述
  • 原文地址:https://blog.csdn.net/weixin_44651073/article/details/126334714