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

matlab 实现二值图像孔洞填充函数imfill()代码如下:function[I2,locations]=imfill(varargin)[I,locations,conn,do_fillholes]=parse_inputs(varargin{:});ifdo_fillholesifislogical(I)mask=uint8(I);elsemask=I;endmask=padarray(mask,ones(1,ndims(mask)),


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

代码如下:

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.net/197277.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++和Java中STL库入门[通俗易懂]

    C++和Java中STL库入门[通俗易懂]C++和Java中STL库入门STL简介为什么使用STLSTL基本概念STL使用前的初始化C++里STL基本容器详解STL简介STL简称标准模版库,被容纳在C++标准程序库,包含了许多基本数据结构和基本算法,使程序员写起来得心应手。为什么使用STL在学习数据结构的时候,在程序中会使用到堆、栈、队列、链表等一些基本的算法,而学习数据结构的时候,这些基本算法写起来十分繁琐,如果不想写这些,那么就可以考虑一下STL了。但是不要太过于依赖STL!STL基本概念要使用STL,需要理解以下几个基本概念:

    2022年8月31日
  • 运行游戏时出现0xc000007b错误的解决方法[通俗易懂]

    运行游戏时出现0xc000007b错误的解决方法[通俗易懂]最后更新:2019-2-28如图,0xc000007b这个错误使无数玩家烦恼。问题描述:出现这个错误,可能是硬件的问题,也可能是软件的问题。但是,由于硬件引起该问题的概率很小,并且除了更换硬件之外没有更好的解决方法,因此本文将详细介绍如何通过软件解决此问题,这也是大家最关心的。由于本文阅读用户众多,大家对于电脑故障解决的熟悉程度也不一样,因此本文致力…

    2022年6月12日
  • 空间回归与地理加权_地理加权显著性

    空间回归与地理加权_地理加权显著性本来这一章准备直接写(照抄)ArcGIS的帮助文档,写地理加权回归工具的使用……,然后就直接结束地理加权回归的,但是近来收到不少同学的邮件,很多都是掉在了当年虾神挖出的大坑里面,比如写了方法,没有列出公式,又比如写了公式木有推导过程(……作为高数战五渣的虾神,推导这种事,他认识我,我不认识他……)所以这次写GWR的时候,尽量少挖点坑,把该写的东西都写完,一者为了以后路过的同学少掉点坑,二者

    2022年10月7日
  • 电子书 android高薪之路-android程序员面试宝典.pdf

    电子书 android高薪之路-android程序员面试宝典.pdf《Android高薪之路:Android程序员面试宝典》取材于各大IT公司面试真题,所给出的试题尽可能地覆盖了Android应用开发的各个方面,而且大多数试题都有解析部分,读者可以通过这部分更深入地理解试题中所包含的技术内容,希望真正做到由点成线,举一反三。 书中还将Android中涉及的各个常用技术问题进行筛选、分类。这样读者可以有的放矢,对自己还没有掌握的Android技术进行重点攻…

    2022年4月28日
  • 前缀索引使用

    前缀索引使用前缀索引使用1.前缀索引索引通常会使用字段的整体用作关键字,但是有些时候,即使使用字段的前段部分数据也是可以去识别某些记录的,而这种方式就是前缀索引,可以更快的去搜索某些数据建立前缀索引的语法:ALTERTABLE表名ADDKEY(字段名(N));N就是要用字段的前几位建立索引。既然我们使用了前缀索引,那么我们肯定就要确认N为多少的时候的辨识度是极限接近最高辨识度的,否则前缀…

    2022年5月23日
  • goland 2021 破解 激活码-激活码分享

    (goland 2021 破解 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号