matlab灰度图孔洞填充,opencv实现二值图像孔洞填充

#include "iostream"

#include 

usingnamespacestd;

usingnamespacecv;

Mat inv_board(Mat src);

Mat inv_img(Mat src);

voiddelarea(Mat& bw,intmax);

Mat imfill(Mat I, intmax);

voidmain()

{

Mat scr = imread("2.png");

Mat I, src_gray, F_B, F_BI_C, temp, H, I_fill;

cvtColor(scr, src_gray, COLOR_BGR2GRAY);

threshold(src_gray, I, 0.1, 1,0);

I_fill = imfill(I,40);

imshow("原二值图", I * 255);

imshow("填充图", I_fill*255);

waitKey(0);

}

Mat imfill(Mat I,intmax)

{

Mat  src_gray, F_B, F_BI_C, temp, H, I_fill;

I_fill = I.clone();

Mat F = inv_board(I);

Mat I_C = inv_img(I);

Mat element = getStructuringElement(0, Size(3, 3), Point(1, 1));

while(1)

{

dilate(F, F_B, element);

F_BI_C = F_B.mul(I_C);

temp = F_BI_C - F;

if(sum(temp) == Scalar(0))

break;

else

F = F_BI_C.clone();

}

H = inv_img(F_BI_C);

Mat H_IC = H.mul(I_C);

delarea(H_IC, max);

for(inti = 0; i 

{

for(intj = 0; j 

{

if(H_IC.at(i, j) == 1)

I_fill.at(i, j) = 1;

}

}

returnI_fill;

}

Mat inv_board(Mat src)

{

introws = src.rows;

intcols = src.cols;

Mat dst = Mat::zeros(rows, cols, CV_8UC1);

for(inti = 0; i 

{

dst.at(0, i) = 1 - src.at(0, i);

}

for(inti = 0; i 

{

dst.at(rows-1, i) = 1 - src.at(rows - 1, i);

}

for(inti = 1; i 

{

dst.at(i, 0) = 1 - src.at(i, 0);

}

for(inti = 1; i 

{

dst.at(i, cols-1) = 1 - src.at(i, cols-1);

}

returndst;

}

Mat inv_img(Mat src)

{

introws = src.rows;

intcols = src.cols;

Mat dst = src.clone();

for(inti = 0; i 

for(intj = 0; j 

dst.at(i, j) = 1 - src.at(i, j);

returndst;

}

voiddelarea(Mat& bw,intmax )

{

Mat bw_copy = bw.clone();

intflag = 0;

Mat H_b, H_bw, temp;

Mat H = Mat::zeros(bw.size(), bw.type());

for(inti = 0; i 

{

for(intj = 0; j 

{

if(bw_copy.at(i, j) == 1)

{

H.at(i, j) = 1;

Mat element = getStructuringElement(0, Size(3, 3), Point(1, 1));

while(1)

{

dilate(H, H_b, element);

H_bw = H_b.mul(bw);

temp = H_bw - H;

if(sum(temp) == Scalar(0))

break;

else

H = H_bw.clone();

}

bw_copy = bw_copy - H_bw;

if(sum(H_bw).val[0] > max)

{

bw = bw - H_bw;

}

H = Mat::zeros(bw.size(), bw.type());

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值