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】lambda表达式与排序

    【python】lambda表达式与排序lambda表达式简单易用的匿名函数文章目录lambda表达式1.什么是lambda表达式2.lambda表达式语法3.lambda表达式的主要用途3.1list.sort()函数3.2自定义属性排序3.3常见的小问题3.4二维列表的排序1.什么是lambda表达式在学习lambda表达式之前,我们先写一个求圆的面积的函数defget_area(radius):return3.14*radius**2radius=float(input())pri

    2022年10月17日
    0
  • qlineedit输入提示_qlineedit设置不可编辑

    qlineedit输入提示_qlineedit设置不可编辑一、QlineEdit基本方法setAlignment()按固定值方式对齐文本Qt.AlignLeft:水平方向靠左对齐Qt.AlignRight:水平方向靠右对齐Qt.AlignCenter:水平方向居中对齐Qt.AlignJustify:水平方向调整间距两端对齐Qt.AlignTop:垂直方向靠上对齐Qt.AlignBottom:垂直方向靠下对齐Qt.AlignVCente…

    2022年10月6日
    0
  • QueueUserWorkItem_thread.join()

    QueueUserWorkItem_thread.join()代码:ThreadPool.SetMaxThreads(100,100);ThreadPool.QueueUserWorkItem((obj)=>{MessageBox.Show(“执行线程中的代码”);});Thread.Sleep(1000);intn=8;ThreadPool.QueueUserWorkItem((obj…

    2022年9月24日
    0
  • portraiture mac智能磨皮滤镜

    portraiture mac智能磨皮滤镜portraiture3Mac版是一款MacOS平台基于原始肖像插件的核心技术和功能集的PS智能磨皮滤镜软件,portraituremac将您的皮肤修饰工作流程提升到更高的性能水平,结果质量和整体易用性。我们敢说,我们的portraiture滤镜插件将继续改变行业,实现几乎所有技能水平,在图像主题和生产挑战的范围内实现卓越的皮肤修饰,包括肖像,全身,团体拍摄,广告,时尚,美容,医疗和运动图像,没有与其他软件产品,插件或数字修饰技术相关的熟悉约束或学习曲线。portraituremac可以出色的完成磨

    2022年7月22日
    5
  • 激光slam_高德导航术语理解

    激光slam_高德导航术语理解ROS激光SLAM导航理解注:最近学习ROS的导航,需要理清ROS的SLAM、环境感知(costmap)、与导航算法。为防止自己忘记,将觉得有价值的内容摘抄于此。文章目录ROS激光SLAM导航理解激光SLAM基本原理基本原理1、占据栅格地图基本原理2、导航基本原理SLAM与导航系统框架:激光SLAM系统框架建图系统框架导航系统框架`move_base`中的使用运用`plugins`Cost…

    2022年8月23日
    8
  • 字符串长度函数strlen()。。字符串函数头文件string.h「建议收藏」

    百度知道看到的string.h头文件里常用的函数有:strlen求字符串长度。strcmp比较2个字符串是否一样。strcat字符串连接操作。strcpy字符串拷贝操作。strncat字符串连接操作(前n个字符)。strncpy字符串拷贝操作(前n个字符)。strchr查询字串。strstr查询子串。string.h是C语言里面关于字符数组的函数定义的头文件,更详细的可以到i…

    2022年4月8日
    47

发表回复

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

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