-
Notifications
You must be signed in to change notification settings - Fork 5
/
imsort.m
136 lines (122 loc) · 3.36 KB
/
imsort.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
function db2 = imsort(fileNameCell,tileDir,col2row, nTile)
% imsort - store the tile images into variabel 'db2'
%
% Input:
% files - image name, cell {n x 1}
% tileDir - file directory of tile images
% nTile - the max number of tile images
%
% Output:
% db2 - properties datas of tile images
% { name - name of tile image
% avg - average rgb (0,1) of tile image, size [1,3]
% score - distance of average rgb to target rgb
% img - color image data
% parts - average rgb of 3x3 divided parts, size [9,3]
% }
%
% Todo:
% 1. parallelization
%
% Author:
% li12242 - Department of Civil Engineering in Tianjin University
% Daniel Claxton - University of Florida
% Email:
%
%
%% check & load exit file 'db.mat'
if isdbFun(tileDir)
answer = questdlg('Would you like to use cached thumbnails?', ...
'Thumnails Found', ...
'Yes','No','Yes'); % default "yes"
if strcmp(answer,'Yes'),
fprintf('Loading Sorting Tile Images\n');
load([tileDir '/db.mat']);
return
end% if
end% if
%% cal tile files
n = size(fileNameCell,1);
k = 1; % contour for tile images
db = struct([]); db2 = struct([]);
for i=1:n
if k >= nTile
break
end% if
file = [tileDir '/' char(fileNameCell(i,:))]; % full path & filename
[pathstr,name,ext] = fileparts(file);
if isImgFun(ext(2:end)) % is an image ifle
img = imread([pathstr '/' name ext]);
[tileRow, tileCol, ~] = size(img);
% cut the tile image
if tileCol/tileRow > col2row
img = img(:, 1:floor(col2row*tileRow), :);
else % too long
img = img(1:floor(tileCol/col2row), :, :);
end
% store into the variable db
db(k).name = file;
db(k).avg = imavg(img); % count the average RGB (0~1) of img [3x1]
db(k).score = clrdist(db(k).avg,[1, 1, 1]); % Need to figure out sorting filter
db(k).img = img;
parts = imparts(img,3,3); % cell {3x3}
db(k).parts = zeros(9, 3);
for j=1:9
db(k).parts(j,:) = imavg(parts{j}); % [3x1]
end
k = k+1;
end
fprintf('Loading Sorting Tile Images, %f\n', i/n);
end
%% sort and restore tile images
[~,ind] = sort(cell2mat({db.score}));
% resort the image data into db2
for i=1:length(db)
db2(i).score = db(ind(i)).score;
db2(i).img = db(ind(i)).img;
db2(i).name = db(ind(i)).name;
db2(i).avg = db(ind(i)).avg;
db2(i).parts = db(ind(i)).parts;
end% for
end% func
%% local function
function out = isdbFun(tiledir)
% isdbFun - exits tile data file
% Input:
% Output:
%
isdb = exist([tiledir, '/db.mat'], 'file');
switch isdb
case 2
out = 1;
case 0
out = 0;
end
end% func
function out = isImgFun(ext)
% isimg - judge an image file by extersion
% Input:
% ext - extersion string of file, e.g, "png", "tif"
% Output:
% out -
% 1, is an image file
% 0, isnot an image file
%
formats = ['bmp';'JPG';'tif';'png';'gif';'cur';'ico'];
for i = 1:size(formats, 1)
out = strcmp(formats(i,:), ext);
while out
return
end
end
end% func
function d = clrdist(a,b)
% clrdist - calculate the distance of two vectors
% Input:
% a - row vector, data [1,3]
% b - row vector, data [1,3]
% Output:
% d - distance of two point
d = sqrt(sum((a-b).^2));
end% func