-
Notifications
You must be signed in to change notification settings - Fork 5
/
im_trim.m
67 lines (55 loc) · 1.6 KB
/
im_trim.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
% trim background from image. Supports RGB or intensity, any class.
%
% INPUTS:
% inim: 2D or 2D image or cell array of images. If it's a cell array, we
% trim all images with the union of the individual masks.
%
% OUTPUTS:
% outim: trimmed image or cell array of images
% mask: 2D logical mask in shape of original image
%
% [outim,mask] = im_trim(inim,trimcolor)
function [outim,groupmask] = im_trim(inim,trimcolor)
wascell = true;
if ~iscell(inim)
inim = {inim};
wascell = false;
end
nim = numel(inim);
for im = 1:nim
thisim = inim{im};
assert(ndims(thisim)<4,'inim must me at most 3D');
if ieNotDefined('trimcolor')
trimcolor = thisim(1,1,:);
end
% insure all matrices are same type (probably uint8)
if ~isequal(class(thisim),class(trimcolor))
trimcolor = feval(class(thisim),trimcolor);
end
insize = size(thisim);
% create an image for matching
if numel(trimcolor)>1
trimcolor = reshape(trimcolor,[1 1 numel(trimcolor)]);
end
trimim = repmat(trimcolor,insize(1:2));
% places where the image diverges from the trimcolor
sumim = all(thisim~=trimim,3);
% rows
rowsumimg = sum(sumim,2);
rowind = find(rowsumimg>0);
rowmask = false(insize(1:2));
rowmask(rowind(1):rowind(end),:) = true;
% columns
colsumimg = sum(sumim,1);
colind = find(colsumimg);
colmask = false(insize(1:2));
colmask(:,colind(1):colind(end),:) = true;
mask{im} = rowmask & colmask;
end
% create group mask
groupmask = any(cat(3,mask{:}),3);
% and mask
outim = im_mask(inim,groupmask);
if ~wascell
outim = outim{1};
end