本文章所提供代码不是自创,由于时间太久实在找不到来源,发布出来只为给大家提供便利,完全免费。
话不多说,不想看文章的直接点击下载链接即可:
点我.
Mat cop
二值图
int n
填充比n
小的孔洞
函数默认为4连通 如想改为8连通 自行修改代码即可。
#include"imfill.h"
Mat imfill(Mat cop,int n)
{
Mat data = ~cop;
Mat labels, stats, centroids;
connectedComponentsWithStats(data, labels, stats, centroids, 4, CV_16U);
int regions_count = stats.rows - 1;
int regions_size, regions_x1, regions_y1, regions_x2, regions_y2;
for (int i = 1; i <= regions_count; i++)
{
regions_size = stats.ptr<int>(i)[4];
if (regions_size < n)
{
regions_x1 = stats.ptr<int>(i)[0];
regions_y1 = stats.ptr<int>(i)[1];
regions_x2 = regions_x1 + stats.ptr<int>(i)[2];
regions_y2 = regions_y1 + stats.ptr<int>(i)[3];
for (int j = regions_y1; j < regions_y2; j++)
{
for (int k = regions_x1; k < regions_x2; k++)
{
if (labels.ptr<ushort>(j)[k] == i)
data.ptr<uchar>(j)[k] = 0;
}
}
}
}
data = ~data;
return data;
}
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#include"imfill.h"
Mat src,dst, gray, erzhi,holef;
int main()
{
src = imread("5.jpg");
//imshow("万丈高楼第一步",src);
blur(src, dst, Size(3, 3), Point(-1, -1));
//imshow("均值滤波",dst);
cvtColor(dst, gray, COLOR_BGR2GRAY);
//imshow("灰度图",gray);
Canny(gray, erzhi, 100, 200, 3, false);
//imshow("边缘检测",erzhi);
holef = imfill(erzhi,1000);
imshow("填洞", holef);
waitKey(0);
return 0;
}
新代码的运行速度较之前发布的相同功能的孔洞填充函数运行速度更快,实践证明大牛无处不在,小白瑟瑟发抖。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。