OpenCV基于C++利用区域生长算法实现下图所示焊缝缺陷提取,其算法如下: (1)将图像转换为灰度图 (2)利用较高的阈值分割灰度图像,得到种子区域(threshold) (3)计算连通域的质心点,获得种子(connectedComponentsWithStats) (4)利用一个偏高的阈值(190)得到遮罩区域(threshold) (5)利用种子、遮罩区域,使用区域生长分割(floodFill),得到缺陷图。代码
时间: 2023-12-08 09:05:17 浏览: 229
下面是基于OpenCV的区域生长算法实现焊缝缺陷提取的代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("input.jpg", IMREAD_GRAYSCALE); // 读取灰度图像
if (img.empty()) // 判断图像是否读取成功
{
cout << "Can't open image!" << endl;
return -1;
}
// 阈值分割,得到种子区域
threshold(img, img, 128, 255, THRESH_BINARY);
// 计算连通域的质心点,获得种子
Mat labels, stats, centroids;
int ncc = connectedComponentsWithStats(img, labels, stats, centroids);
// 遮罩区域
Mat mask = Mat::zeros(img.size(), CV_8UC1);
for (int i = 1; i < ncc; i++)
{
if (stats.at<int>(i, CC_STAT_AREA) < 1000) // 过滤面积小于1000的连通域
continue;
int x = centroids.at<double>(i, 0);
int y = centroids.at<double>(i, 1);
if (img.at<uchar>(y, x) == 255) // 判断种子点是否在白色区域
{
threshold(img, mask, 190, 255, THRESH_BINARY);
floodFill(mask, Point(x, y), Scalar(255));
}
}
// 显示结果
imshow("Image", img);
imshow("Mask", mask);
waitKey();
return 0;
}
```
其中,`imread`函数用于读取灰度图像,`threshold`函数用于阈值分割,`connectedComponentsWithStats`函数用于计算连通域的质心点和面积等统计信息,`floodFill`函数用于区域生长分割,最后用`imshow`函数显示结果。
阅读全文