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

发布时间:2025-12-09 11:52:31 浏览次数:1

代码如下:

function [I2,locations] = imfill(varargin)[I,locations,conn,do_fillholes] = parse_inputs(varargin{ :});if do_fillholesif islogical(I)mask = uint8(I);elsemask = I;endmask = 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);endmarker(idx{ :}) = -Inf;I2 = imreconstruct(marker, mask, conn);I2 = imcomplement(I2);I2 = I2(idx{ :});if islogical(I)I2 = logical(I2);endelse    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 nargincase 1if islogical(IM)% IMFILL(BW1)do_interactive = true;else% IMFILL(I1)do_fillholes = true;endcase 2if 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;endelseif 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;endendcase 3if 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;elseif 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;endendelse% IMFILL(I1,CONN,'holes')validatestring(varargin{ 3}, { 'holes'}, mfilename, 'OPTION', 3);do_fillholes = true;conn = varargin{ 2};do_conn_check = true;conn_position = 2;endendif do_conn_checkiptcheckconn(conn, mfilename, 'CONN', conn_position);endif do_location_checklocations = check_locations(locations, size(IM));    elseif do_interactivelocations = 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);endlocations = 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 )));endif size(locations,2) == 1bad_pix = (locations < 1) | (locations > prod(image_size));elsebad_pix = zeros(size(locations,1),1);for k = 1:num_dimsbad_pix = bad_pix | ((locations(:,k) < 1) | ...(locations(:,k) > image_size(k)));endendif 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'))endif isempty(BW)error(message('images:imfill:emptyImage'))endimshow(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);

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

197277.html

imfill
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477