Code covered by the BSD License  

Highlights from
Statistical Learning Toolbox

from Statistical Learning Toolbox by Dahua Lin
Functions for statistical learning, pattern recognition and computer vision, covering many topics.

Description of slpadimg
Home > sltoolbox > imgproc > slpadimg.m

slpadimg

PURPOSE ^

SLPADIMG Pads an image with boundary

SYNOPSIS ^

function imgpadded = slpadimg(img, padsize, varargin)

DESCRIPTION ^

SLPADIMG Pads an image with boundary 

 $ Syntax $
   - imgpadded = slpadimg(img, padsize, padval)
   - imgpadded = slpadimg(img, padsize, padtype)

 $ Arguments $
   - img:          The original input image
   - padsize:      The boundary widths in [top, bottom, left, right]
                   in addition, it can be in the other two forms:
                   [len] => top = bottom = left = right = len
                   [ey, ex] => top = bottom = ey, left = right = ex
   - padval:       The padded values
   - padtype:      The type of padding 
                   'replicate' | 'symmetric' | 'circular'
   - imgpadded:    The padded image

 $ Description $
   - imgpadded = slpadimg(img, padsize, padval) pads the image with
     constant values. For single-channel image, padval should be a
     scalar. For multi-channle image, padval can be a scalar, which 
     indicates to pad all channels using the same value, or an array
     with the number of elements as the number of channels. Then 
     different channels will be padded with corresponding element.

   - imgpadded = slpadimg(img, padsize, padtype) pads the image with
     specified scheme. Either of the 'replicate', 'circular' or 
     'symmetric'.

 $ History $
   - Created by Dahua Lin, on Sep 1st, 2006

CROSS-REFERENCE INFORMATION ^

This function calls:
  • raise_lackinput RAISE_LACKINPUT Raises an error indicating lack of input argument
  • sltakeval SLTAKEVAL Extracts the values in an array/cell array to output
This function is called by:
  • slpixneighbors SLPIXNEIGHBORS Extracts the neighborhood of pixels from an image

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function imgpadded = slpadimg(img, padsize, varargin)
0002 %SLPADIMG Pads an image with boundary
0003 %
0004 % $ Syntax $
0005 %   - imgpadded = slpadimg(img, padsize, padval)
0006 %   - imgpadded = slpadimg(img, padsize, padtype)
0007 %
0008 % $ Arguments $
0009 %   - img:          The original input image
0010 %   - padsize:      The boundary widths in [top, bottom, left, right]
0011 %                   in addition, it can be in the other two forms:
0012 %                   [len] => top = bottom = left = right = len
0013 %                   [ey, ex] => top = bottom = ey, left = right = ex
0014 %   - padval:       The padded values
0015 %   - padtype:      The type of padding
0016 %                   'replicate' | 'symmetric' | 'circular'
0017 %   - imgpadded:    The padded image
0018 %
0019 % $ Description $
0020 %   - imgpadded = slpadimg(img, padsize, padval) pads the image with
0021 %     constant values. For single-channel image, padval should be a
0022 %     scalar. For multi-channle image, padval can be a scalar, which
0023 %     indicates to pad all channels using the same value, or an array
0024 %     with the number of elements as the number of channels. Then
0025 %     different channels will be padded with corresponding element.
0026 %
0027 %   - imgpadded = slpadimg(img, padsize, padtype) pads the image with
0028 %     specified scheme. Either of the 'replicate', 'circular' or
0029 %     'symmetric'.
0030 %
0031 % $ History $
0032 %   - Created by Dahua Lin, on Sep 1st, 2006
0033 %
0034 
0035 %% parse and verify input
0036 
0037 if nargin < 3
0038     raise_lackinput('slpadimg', 3);
0039 end
0040 
0041 % process padsize
0042 
0043 if ~isvector(padsize)
0044     error('sltoolbox:invalidarg', ...
0045         'The padsize should be a vector');
0046 end
0047 
0048 if length(padsize) == 1
0049     padsize = padsize * ones(1, 4);
0050 elseif length(padsize) == 2
0051     padsize = [padsize(1), padsize(1), padsize(2), padsize(2)];
0052 elseif length(padsize) == 4
0053     padsize = padsize(:)';
0054 else
0055     error('sltoolbox:invalidarg', ...
0056         'The length of padsize is illegal');
0057 end    
0058 
0059 
0060 % decide number of channels k
0061 d = ndims(img);
0062 if d == 2
0063     k = 1;
0064 elseif d == 3
0065     k = size(img, 3);
0066 else
0067     imgsiz = size(img);
0068     k = prod(imgsiz(3:end));
0069 end
0070     
0071 padparam = varargin{1};
0072 if isnumeric(padparam) || islogical(padparam)
0073     padtype = 'constant';
0074     padval = padparam;
0075     if numel(padval) == 1
0076         if k > 1
0077             padval = padval * ones(k, 1);
0078         end
0079     elseif numel(padval) == k
0080         padval = padval(:);
0081     else
0082         error('sltoolbox:sizmismatch', ...
0083             'The size of padval is illegal');
0084     end
0085 elseif ischar(padparam)
0086     padtype = padparam;
0087     if ~ismember(padtype, {'replicate', 'circular', 'symmetric'})
0088         error('sltoolbox:invalidarg', ...
0089             'Invalid padding type: %s', padtype);
0090     end
0091 else
0092     error('sltoolbox:invalidarg', 'The padding parameters is invalid');
0093 end
0094 
0095 %% Main skeleton
0096 
0097 switch padtype
0098     case 'constant'
0099         imgpadded = pad_constant(img, padsize, padval);
0100     case 'replicate'
0101         imgpadded = pad_replicate(img, padsize);
0102     case 'circular'
0103         imgpadded = pad_circular(img, padsize);
0104     case 'symmetric'
0105         imgpadded = pad_symmetric(img, padsize);
0106 end
0107 
0108 %% Reshape
0109 
0110 if d > 3
0111     imgsiz(1) = size(imgpadded, 1);
0112     imgsiz(2) = size(imgpadded, 2);
0113     imgpadded = reshape(imgpadded, imgsiz);
0114 end
0115 
0116 
0117 %% Core functions
0118 
0119 function imgdst = pad_constant(img, padsize, padval)
0120 
0121 [h0, w0, k] = size(img);
0122 hd = h0 + padsize(1) + padsize(2);
0123 wd = w0 + padsize(3) + padsize(4);
0124 
0125 % make the constant layer
0126 padval = reshape(padval, [1 1 k]);
0127 imgdst = padval(ones(hd,1), ones(wd,1), :);
0128 
0129 % put in the target
0130 i0 = padsize(1) + 1; i1 = padsize(1) + h0;
0131 j0 = padsize(3) + 1; j1 = padsize(3) + w0;
0132 
0133 imgdst(i0:i1, j0:j1, :) = img(:, :, :);
0134 
0135 
0136 function imgdst = pad_replicate(img, padsize)
0137 
0138 [tm, bm, lm, rm] = sltakeval(padsize);
0139 h0 = size(img, 1);
0140 w0 = size(img, 2);
0141 
0142 inds_i = [ones(1, tm), 1:h0, ones(1, bm) * h0];
0143 inds_j = [ones(1, lm), 1:w0, ones(1, rm) * w0];
0144 
0145 imgdst = img(inds_i, inds_j, :);
0146 
0147 
0148 function imgdst = pad_circular(img, padsize)
0149 
0150 [tm, bm, lm, rm] = sltakeval(padsize);
0151 h0 = size(img, 1);
0152 w0 = size(img, 2);
0153 
0154 inds_i = mod(-tm:h0+bm-1, h0) + 1;
0155 inds_j = mod(-lm:w0+rm-1, w0) + 1;
0156 
0157 imgdst = img(inds_i, inds_j, :);
0158 
0159 
0160 function imgdst = pad_symmetric(img, padsize)
0161 
0162 [tm, bm, lm, rm] = sltakeval(padsize);
0163 h0 = size(img, 1);
0164 w0 = size(img, 2);
0165 
0166 sni = [1:h0, h0:-1:1];
0167 snj = [1:w0, w0:-1:1];
0168 
0169 inds_i = sni(mod(-tm:h0+bm-1, h0*2) + 1);
0170 inds_j = snj(mod(-lm:w0+rm-1, w0*2) + 1);
0171 
0172 imgdst = img(inds_i, inds_j, :);
0173 
0174 
0175 
0176 
0177 
0178 
0179 
0180 
0181         
0182     
0183     
0184     
0185     
0186

Generated on Wed 20-Sep-2006 12:43:11 by m2html © 2003

Contact us at files@mathworks.com