我有一个表示 MATLAB 中的数字的二进制图像:
我想填写所有数字。期望的结果是:
我唯一找到的是imfill
函数,但这并没有什么帮助,因为我丢失了我的内部数据(例如 9 的内圈)。
我有一个表示 MATLAB 中的数字的二进制图像:
我想填写所有数字。期望的结果是:
我唯一找到的是imfill
函数,但这并没有什么帮助,因为我丢失了我的内部数据(例如 9 的内圈)。
另一种可能性是使用BWBOUNDARIES函数,它:
跟踪对象的外部边界,以及这些对象内部的孔的边界
该信息包含在第四个输出中A
,这是一个表示父子孔依赖关系的邻接矩阵。
%# read binary image
bw = imread('SUvif.png');
%# find all boundaries
[B,L,N,A] = bwboundaries(bw, 8, 'holes');
%# exclude inner holes
[r,~] = find(A(:,N+1:end)); %# find inner boundaries that enclose stuff
[rr,~] = find(A(:,r)); %# stuff they enclose
idx = setdiff(1:numel(B), [r(:);rr(:)]); %# exclude both
bw2 = ismember(L,idx); %# filled image
%# compare results
subplot(311), imshow(bw), title('original')
subplot(312), imshow( imfill(bw,'holes') ), title('imfill')
subplot(313), imshow(bw2), title('bwboundaries')
问题是如何区分孔和数字。一种可能的临时解决方案是通过内部像素的区域过滤它们。
function SolveSoProblem()
I = imread('http://i.stack.imgur.com/SUvif.png');
%Fill all the holes
F = imfill(I,'holes');
%Find all the small ones,and mark their edges in the image
bw = bwlabel(I);
rp = regionprops(bw,'FilledArea','PixelIdxList');
indexesOfHoles = [rp.FilledArea]<150;
pixelsNotToFill = vertcat(rp(indexesOfHoles).PixelIdxList);
F(pixelsNotToFill) = 0;
figure;imshow(F);
%Remove the inner area
bw1 = bwlabel(F,4);
rp = regionprops(bw1,'FilledArea','PixelIdxList');
indexesOfHoles1 = [rp.FilledArea]<150;
pixelListToRemove = vertcat(rp(indexesOfHoles1).PixelIdxList);
F(pixelListToRemove) = 0;
figure;imshow(F);
end
在步骤(1)之后:
在步骤(2)之后:
假设左上角的像素总是在要填充的区域之外:
跨越顶行,将像素复制到输出图像
当您在输入图像中出现一个白色像素后跟一个黑色像素时,开始在输出图像中设置白色像素,直到出现黑色像素后跟一个白色像素。