opencv实战——复杂背景下寻找物体轮廓(底帽)

摘要

这套算法首先解决了在复杂背景下轮廓提取的问题,而且我认为也是稳健鲁棒的。其中,算法中除了经典的“hsv分解->ostu阈值->最大轮廓标注”外,最为关键的算法为底帽去光差。这个算法来自于冈萨雷斯《数字图像处理教程》形态学篇章,完全按照书本建议实现,体现良好作用


 一、问题提出

这是一个来自"answerOpenCV"(http://answers.opencv.org/question/200422/opencv-c-filling-holes/)整编如下:

title:OpenCV / C++ - Filling holes

content:

Hello there,

For a personnel projet, I'm trying to detect object and there shadow. These are the result I have for now: Original: 

 二、问题分析

从原始图片上来看,这张图片的拍摄的背景比较复杂,此外光照也存在偏光现象;而提问者虽然提出的是“将缝隙合并”的要求,实际上他还是想得到目标物体的准确轮廓。

三、问题解决

整体思路:(思路很重要!!!)

  1. 读入图像,转成hsv空间
  2. 对h通道图像底帽运算
  3. 二值化
  4. 寻找轮廓,并筛选显示

opencv实现:

    Mat moveLightDiff(Mat src, int radius);
    Mat src = imread("D:/opencv练习图片/复杂背景下提取轮廓.png");
    imshow("原始图", src);
    Mat src_hsv,src_h,src_s, src_v,src_tophat,src_bin;
    cvtColor(src, src_hsv, COLOR_RGB2HSV);
    vector<Mat> rgb_planes;
    split(src_hsv, rgb_planes);
    src_h = rgb_planes[0]; 
    imshow("H通道", src_h);
    Mat kernel = getStructuringElement(MORPH_RECT, Size(30, 30), Point(-1, -1));
    morphologyEx(src_h, src_h, MORPH_BLACKHAT, kernel, Point(-1, -1));
    imshow("BLACKPHAT", src_h);
    threshold(src_h, src_bin, 100, 255, THRESH_OTSU);
    imshow("二值化", src_bin);
    int max = 0;
    int index = -1;
    vector<vector<Point> >contours;
    findContours(src_bin, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
    for (int i = 0; i < contours.size(); i++) {
        int area= contourArea(contours[i]);
        if (max < area) {
            index = i;
            max = area;
        }
    }
    drawContours(src, contours, index, Scalar(0, 0, 255), 2);
    imshow("显示轮廓", src);


 顶帽运算与底帽运算的理解和分析

顶帽变换和底帽(黑帽)变换属于图像形态学处理的一种,可用于校正不均匀光照的影响。

  • 顶帽变换用于凸显暗背景上的亮物体。(也可叫白帽)
  • 底帽变换用于凸显亮背景上的暗物体。(也可叫黑帽)

 如上图所示。当图像各部分光照不均匀造成的背景灰度不均现象,单纯用二值化处理效果不好就可以用顶帽(底帽)处理。由于原图是背景亮,前景暗,对原图进行底帽变换以解决光照不均匀的问题。

 直接对h通道二值化效果:

 先底帽矫正后再二值化效果:

 摘录于寻找复杂背景下物体的轮廓(OpenCV / C++ - Filling holes) - jsxyhelu - 博客园 (cnblogs.com)

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
机器学习水果识别是一种利用机器学习算法和图像处理技术对水果进行自动识别的方法。其中,使用Python中的OpenCV库实现物体特征提取是一种常见的实现方式。 OpenCV是一个强大的开源计算机视觉库,提供了许多用于图像处理和分析的函数和工具。它可以辅助我们实现水果识别所需要的特征提取步骤。 首先,我们需要准备水果图像数据集。这些图像可以是不同种类的水果,每个水果都有多个不同视角的图像。接下来,我们使用OpenCV库中的函数加载和处理这些图像。 在特征提取中,我们可以使用很多不同的技术。其中,最常用的方法是使用图像的颜色和纹理特征。在处理图像时,我们可以使用OpenCV中的函数计算这些特征。 例如,我们可以使用OpenCV中的函数提取图像的颜色直方图。这可以帮助我们了解图像中不同颜色的比例和分布情况。在水果识别中,不同水果的颜色特征往往是不同的。 此外,我们还可以使用OpenCV中的纹理特征提取方法,比如局部二值模式(Local Binary Patterns)。这可以帮助我们分析图像中的纹理信息,如图像的细节和纹理变化。这些纹理特征在识别不同类型的水果时也是有用的。 最后,我们可以使用机器学习算法,如支持向量机(SVM)或卷积神经网络(CNN),来训练一个分类模型。这个模型可以根据提取的特征来判断输入图像是否为某种水果。 总之,使用Python中的OpenCV库实现水果识别中的物体特征提取是一种非常有效的方法。通过提取图像的颜色和纹理特征,并使用机器学习算法进行分类,我们可以实现一个准确和高效的水果识别系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值