-
Notifications
You must be signed in to change notification settings - Fork 41
/
sc_create_pyramid.m
144 lines (109 loc) · 3.99 KB
/
sc_create_pyramid.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
function [imgPyr, maskPyr, scaleImgPyr] = sc_create_pyramid(img, mask, optS)
% SC_CREAT_IMG_PYRAMID
%
% Create image pyramid with linear or log scale for coarse to fine image
% completion
%
% Input:
% - img: input image with hole
% - mask: Hole mask
% - optS: options
% Output:
% - imgPyr: Image pyramid
% - maskPyr: Mask pyramid
% - scaleImgPyr: Image dimensions in each level
% Image size in the high-resolution image
[imgHeight, imgWidth, nCh] = size(img);
img = sc_init_coarsest_level(img, logical(mask));
% =========================================================================
% Create pyramid: scale
% =========================================================================
scaleImgPyr = sc_create_scale_pyramid(imgHeight, imgWidth, optS);
% =========================================================================
% Create pyramid: mask
% =========================================================================
maskPyr = sc_create_image_pyramid(mask, scaleImgPyr, 'mask', optS);
% =========================================================================
% Create pyramid: image
% =========================================================================
imgPyr = sc_create_image_pyramid(img, scaleImgPyr, 'image', optS);
% =========================================================================
% Recover image boundary
% =========================================================================
% nCh = 3;
% for iLvl = 1: optS.numPyrLvl
% maskCur = maskPyr{iLvl};
% bdRegion = maskCur < 0.99 & maskCur > 0.1;
% bdRegionC = bdRegion(:,:,ones(nCh,1));
%
% imgCur = imgPyr{iLvl};
% imgCurBd = bsxfun(@rdivide, imgCur, maskCur);
% imgCur(bdRegionC) = imgCurBd(bdRegionC);
% imgPyr{iLvl} = imgCur;
% end
% Initialize the coarsest level
imgPyr{optS.numPyrLvl} = sc_init_coarsest_level(imgPyr{optS.numPyrLvl}, maskPyr{optS.numPyrLvl});
% Convert to single type
imgPyr = cellfun(@im2single, imgPyr, 'UniformOutput', false);
end
function img = sc_init_coarsest_level(img, mask)
% Get the inital solution
[~, idMap] = bwdist(~mask, 'euclidean');
% Intepolate only in the interior to avoid dark values near the image borders
maskInt = mask;
maskInt(1,:) = 0; maskInt(end,:) = 0;
maskInt(:,1) = 0; maskInt(:,end) = 0;
for ch = 1: 3
imgCh = img(:,:,ch);
imgCh = imgCh(idMap);
img(:,:,ch) = roifill(imgCh, maskInt);
end
end
function imgPyr = sc_create_image_pyramid(img, scaleImgPyr, imageType, optS)
% h = fspecial('gaussian', 5, 1);
% Initialize image pyramid
imgPyr = cell(optS.numPyrLvl, 1);
% The finest level
imgPyr{1} = img;
%
for iLvl = 2: optS.numPyrLvl
imgHCurLvl = scaleImgPyr{iLvl}.imgSize(1);
imgWCurLvl = scaleImgPyr{iLvl}.imgSize(2);
% Previous layer
imgCur = imgPyr{iLvl - 1};
% Anti-alising by blurring
% imgCur = imfilter(imgCur, h, 'same', 'replicate', 'conv');
% Resampling
imgPyr{iLvl} = imresize(imgCur, [imgHCurLvl, imgWCurLvl], optS.resampleKernel);
end
if(strcmp(imageType, 'mask'))
% Convert resampled masks into logical type
for iLvl = 1: optS.numPyrLvl
imgPyr{iLvl} = imgPyr{iLvl} > 0.5;
end
end
end
function scaleImgPyr = sc_create_scale_pyramid(imgHeight, imgWidth, optS)
% Compute the coarsest image scale
imgSizeMin = min(imgHeight, imgWidth);
coarestScale = optS.coarestImgSize/imgSizeMin;
% Compute the scale in each layer in the image pyramid
if(optS.useLogScale) % use log scale
scalePyr = 2.^linspace(0, log2(coarestScale), optS.numPyrLvl);
else % use linear scale
scalePyr = linspace(1, coarestScale, optS.numPyrLvl);
end
% Image size in each layer
imgHPyr = round(imgHeight *scalePyr);
imgWPyr = round(imgWidth *scalePyr);
% Initialize scales
scaleImgPyr = cell(optS.numPyrLvl, 1);
% Finest level
scaleImgPyr{1}.imgScale = 1;
scaleImgPyr{1}.imgSize = [imgHeight, imgWidth];
% Downsampled images
for k = 2: optS.numPyrLvl
scaleImgPyr{k}.imgScale = scalePyr(k);
scaleImgPyr{k}.imgSize = [imgHPyr(k), imgWPyr(k)];
end
end