首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不规则形状的OpenCV直方图

不规则形状的OpenCV直方图
EN

Stack Overflow用户
提问于 2015-06-01 06:05:37
回答 2查看 868关注 0票数 2

我对OpenCV比较陌生。我想知道是否有可能得到一个轮廓直方图(它可以是一个完美的矩形或不规则的形状)找到的轮廓。

提前谢谢。

编辑:

这正是我想要达到的目标。我想分析轮廓中的区域以检测缺陷(通过分析区域的直方图?)并宣布件有缺陷或良好。图片附呈。

样本不错。(检测到的轮廓用灰色勾画)

有缺陷的样本(左上角的缺陷)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-01 06:18:49

你可能会误用直方图。

图像的Contour应该是一个二值的、无颜色的矩阵,它不代表像素的灰度级,而是表示边界。同时,histogram是一个分析像素灰度值在2D图像中分布情况的工具,不是吗?

因此,为什么要分析一个可能无助于分析图像的二进制值矩阵的histogram?然而,直方图并不是进行轮廓分析的正确方法。

你可能从直方图中得到的应该只是一个两条直方图,因为等高线矩阵只包含二进制值。这可能无助于分析。

票数 1
EN

Stack Overflow用户

发布于 2015-06-02 03:47:50

这是另一种使用形态运算的方法。

代码语言:javascript
复制
#include <string>
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

cv::Mat make_element(int morph_size, int elem_type)
{
    cv::Size sz{2*morph_size+1, 2*morph_size+1};
    cv::Point pt{morph_size, morph_size};
    cv::Mat element{getStructuringElement(elem_type, sz, pt)};
    return element;
}

int main(int argc, char **argv)
{
    std::string fn{argv[1]};
    cv::Mat src{cv::imread(fn)}, dst, mask[3];

    if (!src.data) {
        std::cerr << "No image data :(" << std::endl;
        return -1;
    }

    // Clean out noise
    cv::Mat elem1{make_element(5, cv::MORPH_RECT)};
    cv::morphologyEx(src, dst, cv::MORPH_OPEN, elem1);

    // Close the hole, then XOR with original
    cv::Mat elem2{make_element(45, cv::MORPH_ELLIPSE)};
    morphologyEx(dst, dst, cv::MORPH_CLOSE, elem2);
    cv::bitwise_xor(src, dst, dst);

    // Clean out noise (again)
    cv::Mat elem3{make_element(1, cv::MORPH_RECT)};
    cv::morphologyEx(dst, dst, cv::MORPH_OPEN, elem3);

    // Mark the hole
    cv::split(dst, mask);
    cv::bitwise_xor(src, dst, dst, mask[0]);

    // Overlay
    cv::split(dst, mask);
    cv::Mat empty{dst.size(), CV_8UC1};
    std::vector<cv::Mat> v{empty, empty, mask[0]};
    cv::merge(v, dst);
    cv::bitwise_or(src, dst, dst);

    cv::namedWindow("Defect (ESC to quit)", cv::WINDOW_NORMAL);
    cv::startWindowThread();
    cv::imshow("Defect (ESC to quit)", dst);
    while (true) {
        int k = cv::waitKey(100) & 0xff;
        if (k == 27) {
            break;
        }
    }
    cv::destroyAllWindows();

    return 0;
};

另加如下:

  • Shapiro/Stockman,查找齿轮缺陷,第三章
  • OpenCV 形态学教程
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30566627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档