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)),

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解[通俗易懂]

    [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解[通俗易懂]前一篇文章讲述了数据预处理、Jieba分词和文本聚类知识,这篇文章主要介绍Matplotlib和Pandas扩展包绘图的基础用法,同时引入Echarts技术,该技术主要应用于网站可视化展示中。本文内容以实例为主,给读者最直观的图形感受。两万字基础文章,希望对您有所帮助。

    2025年6月7日
    3
  • 电赛前期准备[通俗易懂]

    电赛前期准备[通俗易懂]根据竞赛的特点,我们可以将赛前培训可划分为条件准备和实践训练两大部分。我们的讨论以赛前条件准备工作为主。刘开华条件准备工作可划分为:组织准备:主要是邀请指导教师、组建队伍,主攻方向确定。知识准备:包括基础知识、专业知识、通用元器件应用知识和电子系统设计知识。能力准备:创新能力,软件编程能力,电路设计与调试能力,系统设计、制作与调试能力,仪器使用与…

    2022年5月9日
    63
  • Pytroch入坑 3. 自己的人脸数据+迁移学习(resnet18)

    Pytroch入坑 3. 自己的人脸数据+迁移学习(resnet18)本文转载自:http://www.zhongruitech.com/856941441.html0.前言之前是使用了mnist数据,且网络结构比较简单,针对自己的数据,如何使用更复杂、经典的网络呢?1.数据集目标是人脸识别,可以看做一个多分类问题,本次实验的数据集为ferest,共200个人,1400张38080图片,比较小。分为train和val两个目录,每个目录下都有200个…

    2022年5月25日
    50
  • lua学习之table类型

    关系表类型,这是一个很强大的类型。我们可以把这个类型看作是一个数组。只是 C语言的数组,只能用正整数来作索引; 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是&#1

    2021年12月25日
    44
  • 解决VS2005打开js,css,asp.php等文件,中文都是乱码的问题

    解决VS2005打开js,css,asp.php等文件,中文都是乱码的问题

    2021年11月17日
    48
  • YUV简介

    YUV简介介绍YUV的相关概念。YUV444YUV422YUV420。YUV与RGB。

    2022年7月16日
    16

发表回复

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

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