[b758a2]: / matlab / add_dataset.m

Download this file

97 lines (86 with data), 2.2 kB

 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
function [len_M, num_true] = add_dataset(image_file, csv_file, dataset_folder)
% parameters
d = 10;
d2 = d*d;
N = 101; % must be odd
R = (N-1)/2;
S = R + d;
% create list of coordinates within a circle of radius d
k = 1;
for i=(1-d):(d-1)
for j=(1-d):(d-1)
if i*i + j*j < d2
region(k,:) = [i j];
k = k + 1;
end
end
end
% load image and csv files
A = imread(image_file);
M = csvread(csv_file);
[A_height, A_width, ~] = size(A);
% extend the image by mirroring (just for the positive samples)
D = padarray(A,[S S],'symmetric');
% find the centroids
len_M = size(M,1);
P = zeros(len_M,2);
for i=1:len_M;
tmp = M(i,:);
tmp = tmp(tmp~=0);
len_tmp = size(tmp,2);
sum_X = 0;
sum_Y = 0;
for j=1:len_tmp/2
sum_X = sum_X + tmp(2*j-1);
sum_Y = sum_Y + tmp(2*j);
end
mean_X = 2*sum_X/len_tmp;
mean_Y = 2*sum_Y/len_tmp;
P(i,:) = [mean_Y mean_X];
end
M = round(P);
% create positive dataset
% extract many images within a region around each mitosis
len_region = size(region,1);
B = cell(1,len_M*len_region);
for i=1:len_M
for j=1:len_region
y1 = M(i,1) + region(j,1) - R + S;
y2 = M(i,1) + region(j,1) + R + S;
x1 = M(i,2) + region(j,2) - R + S;
x2 = M(i,2) + region(j,2) + R + S;
%{
if y1 >= 1 && y2 <= A_height && x1 >= 1 && x2 <= A_width
B{j+(i-1)*len_region} = A(y1:y2, x1:x2, :);
end
%}
B{j+(i-1)*len_region} = D(y1:y2, x1:x2, :);
end
end
%B = B(~cellfun('isempty', B));
% create negative dataset
H = A_height - N + 1;
W = A_width - N + 1;
num_true = length(B);
C = cell(1,num_true);
for i=1:num_true
flag = true;
while flag
X = randi(W);
Y = randi(H);
flag = isPos(X,Y,M,d);
end
y1 = Y;
y2 = Y + 2*R;
x1 = X;
x2 = X + 2*R;
C{i} = A(y1:y2, x1:x2, :);
end
% write set of images to file
n = length(dir([dataset_folder 'true/*.png']));
for i=1:num_true
file1 = [dataset_folder 'true/' num2str(i+n,'%02u') '.png'];
file2 = [dataset_folder 'false/' num2str(i+n,'%02u') '.png'];
imwrite(B{i}, file1, 'png');
imwrite(C{i}, file2, 'png');
end