#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());
}
}
}
}