前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matlab 实现二值图像孔洞填充函数imfill()

matlab 实现二值图像孔洞填充函数imfill()

作者头像
全栈程序员站长
发布2022-10-29 10:13:06
6120
发布2022-10-29 10:13:06
举报

大家好,又见面了,我是你们的朋友全栈君。

代码如下:

代码语言:javascript
复制
function [I2,locations] = imfill(varargin)
[I,locations,conn,do_fillholes] = parse_inputs(varargin{ 
:});
if do_fillholes
if islogical(I)
mask = uint8(I);
else
mask = I;
end
mask = padarray(mask, ones(1,ndims(mask)), -Inf, 'both');
mask = imcomplement(mask);
marker = mask;
idx = cell(1,ndims(I));
for k = 1:ndims(I)
idx{ 
k} = 2:(size(marker,k) - 1);
end
marker(idx{ 
:}) = -Inf;
I2 = imreconstruct(marker, mask, conn);
I2 = imcomplement(I2);
I2 = I2(idx{ 
:});
if islogical(I)
I2 = logical(I2);
end
else    
mask = imcomplement(I);
marker = false(size(mask));
marker(locations) = mask(locations);
marker = imreconstruct(marker, mask, conn);
I2 = I | marker;
end
%%%
%%% Subfunction ParseInputs
%%%
function [IM,locations,conn,do_fillholes] = parse_inputs(varargin)
narginchk(1,3);
IM = varargin{ 
1};
validateattributes(IM, { 
'numeric' 'logical'}, { 
'nonsparse' 'real','nonnan'}, ...
mfilename, 'I1 or BW1', 1);
do_interactive = false;
do_fillholes = false;
conn = conndef(ndims(IM),'minimal');
do_conn_check = false;
locations = [];
do_location_check = false;
switch nargin
case 1
if islogical(IM)
% IMFILL(BW1)
do_interactive = true;
else
% IMFILL(I1)
do_fillholes = true;
end
case 2
if islogical(IM)
if ischar(varargin{ 
2})
% IMFILL(BW1, 'holes')
validatestring(varargin{ 
2}, { 
'holes'}, mfilename, 'OPTION', 2);
do_fillholes = true;
else
% IMFILL(BW1, LOCATIONS)
locations = varargin{ 
2};
do_location_check = true;
end
else
if ischar(varargin{ 
2})
% IMFILL(I1, 'holes')
validatestring(varargin{ 
2}, { 
'holes'}, mfilename, 'OPTION', 2);
do_fillholes = true;
else
% IMFILL(I1, CONN)
conn = varargin{ 
2};
do_conn_check = true;
conn_position = 2;
do_fillholes = true;
end
end
case 3
if islogical(IM)
if ischar(varargin{ 
3})
% IMFILL(BW1,CONN,'holes')
validatestring(varargin{ 
3}, { 
'holes'}, mfilename, 'OPTION', 3);
do_fillholes = true;
conn = varargin{ 
2};
do_conn_check = true;
conn_position = 2;
else
if isequal(varargin{ 
2}, 0)
% IMFILL(BW1,0,CONN)
do_interactive = true;
conn = varargin{ 
3};
do_conn_check = true;
conn_position = 2;
else
% IMFILL(BW1,LOCATIONS,CONN)
locations = varargin{ 
2};
do_location_check = true;
conn = varargin{ 
3};
do_conn_check = true;
conn_position = 3;
end
end
else
% IMFILL(I1,CONN,'holes')
validatestring(varargin{ 
3}, { 
'holes'}, mfilename, 'OPTION', 3);
do_fillholes = true;
conn = varargin{ 
2};
do_conn_check = true;
conn_position = 2;
end
end
if do_conn_check
iptcheckconn(conn, mfilename, 'CONN', conn_position);
end
if do_location_check
locations = check_locations(locations, size(IM));    
elseif do_interactive
locations = get_locations_interactively(IM);
end
% Convert to linear indices if necessary.
if ~do_fillholes && (size(locations,2) ~= 1)
idx = cell(1,ndims(IM));
for k = 1:ndims(IM)
idx{ 
k} = locations(:,k);
end
locations = sub2ind(size(IM), idx{ 
:});
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function locations = check_locations(locations, image_size)
%   Checks validity of LOCATIONS.  Converts LOCATIONS to linear index
%   form.  Warns if any locations are out of range.
validateattributes(locations, { 
'double'}, { 
'real' 'positive' 'integer' '2d'}, ...
mfilename, 'LOCATIONS', 2);
num_dims = length(image_size);
if (size(locations,2) ~= 1) && (size(locations,2) ~= num_dims)
error(message('images:imfill:badLocationSize', iptnum2ordinal( 2 )));
end
if size(locations,2) == 1
bad_pix = (locations < 1) | (locations > prod(image_size));
else
bad_pix = zeros(size(locations,1),1);
for k = 1:num_dims
bad_pix = bad_pix | ((locations(:,k) < 1) | ...
(locations(:,k) > image_size(k)));
end
end
if any(bad_pix)
warning(message('images:imfill:outOfRange'));
locations(bad_pix,:) = [];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function locations = get_locations_interactively(BW)
%   Display image and give user opportunity to select locations with the mouse.
if ~ismatrix(BW)
error(message('images:imfill:badInteractiveDimension'))
end
if isempty(BW)
error(message('images:imfill:emptyImage'))
end
imshow(BW)
[xi,yi] = getpts;
c = round(axes2pix(size(BW,2), [1 size(BW,2)], xi));
r = round(axes2pix(size(BW,1), [1 size(BW,1)], yi));
locations = sub2ind(size(BW),r,c);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197277.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月4日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档