我对OpenCV比较陌生。我想知道是否有可能得到一个轮廓直方图(它可以是一个完美的矩形或不规则的形状)找到的轮廓。
提前谢谢。
编辑:
这正是我想要达到的目标。我想分析轮廓中的区域以检测缺陷(通过分析区域的直方图?)并宣布件有缺陷或良好。图片附呈。
样本不错。(检测到的轮廓用灰色勾画)

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

发布于 2015-06-01 06:18:49
你可能会误用直方图。
图像的Contour应该是一个二值的、无颜色的矩阵,它不代表像素的灰度级,而是表示边界。同时,histogram是一个分析像素灰度值在2D图像中分布情况的工具,不是吗?
因此,为什么要分析一个可能无助于分析图像的二进制值矩阵的histogram?然而,直方图并不是进行轮廓分析的正确方法。
你可能从直方图中得到的应该只是一个两条直方图,因为等高线矩阵只包含二进制值。这可能无助于分析。
发布于 2015-06-02 03:47:50
这是另一种使用形态运算的方法。
#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;
};另加如下:
https://stackoverflow.com/questions/30566627
复制相似问题