added edge extraction, added spatial colour texture descriptor

This commit is contained in:
aj 2019-11-09 13:03:08 +00:00
parent 1393656203
commit 5a83879c78
14 changed files with 190 additions and 13 deletions

View File

@ -23,7 +23,9 @@ OUT_FOLDER = 'descriptors';
%% the idea is all your descriptors are in individual folders - within
%% the folder specified as 'OUT_FOLDER'.
% OUT_SUBFOLDER='avgRGB';
OUT_SUBFOLDER='globalRGBhisto';
% OUT_SUBFOLDER='globalRGBhisto';
% OUT_SUBFOLDER='spatialColour';
OUT_SUBFOLDER='spatialColourTexture';
allfiles=dir (fullfile([DATASET_FOLDER,'/Images/*.bmp']));
for filenum=1:length(allfiles)
@ -36,7 +38,9 @@ for filenum=1:length(allfiles)
%% EXTRACT FUNCTION
% F=extractAvgRGB(img);
F=extractGlobalColHist(img);
% F=extractGlobalColHist(img);
% F=extractSpatialColour(img);
F=extractSpatialColourTexture(img);
save(fout,'F');
toc
end

View File

@ -28,7 +28,9 @@ DESCRIPTOR_FOLDER = 'descriptors';
%% and within that folder, another folder to hold the descriptors
%% we are interested in working with
% DESCRIPTOR_SUBFOLDER='avgRGB';
DESCRIPTOR_SUBFOLDER='globalRGBhisto';
% DESCRIPTOR_SUBFOLDER='globalRGBhisto';
% DESCRIPTOR_SUBFOLDER='spatialColour';
DESCRIPTOR_SUBFOLDER='spatialColourTexture';
%% 1) Load all the descriptors into "ALLFEAT"
@ -59,7 +61,7 @@ end
% get counts for each category for PR calculation
CAT_HIST = histogram(ALLCATs).Values;
run_total = 20;
run_total = 100;
AP_values = zeros([1, run_total]);
for run=1:run_total
%% 2) Pick an image at random to be the query
@ -81,7 +83,7 @@ for run=1:run_total
end
dst=sortrows(dst,1); % sort the results
%% 3.5) Calculate PR
%% 4) Calculate PR
precision_values=zeros([1, NIMG]);
recall_values=zeros([1, NIMG]);
@ -89,6 +91,8 @@ for run=1:run_total
query_row = dst(1,:);
query_category = query_row(1,3);
%calculate PR for each n
for i=1:NIMG
rows = dst(1:i, :);
@ -129,7 +133,7 @@ for run=1:run_total
end
%% 3.6) calculate AP
%% 5) calculate AP
P_rel_n = zeros([1, NIMG]);
for i = 1:NIMG
precision = precision_values(i);
@ -142,9 +146,10 @@ for run=1:run_total
average_precision = sum_P_rel_n / CAT_HIST(1,query_category);
AP_values(run) = average_precision;
%% 3.8) plot PR curve
%% 6) plot PR curve
figure(1)
plot(recall_values, precision_values);
hold on;
@ -154,12 +159,18 @@ for run=1:run_total
end
%% 3.9 Calculate MAP
%% 7 Calculate MAP
AP_values
MAP = mean(AP_values)
figure(2)
plot(1:run_total, AP_values);
title('Average Precision Per Run');
xlabel('Run');
ylabel('Average Precision');
%% 4) Visualise the results
%% 8) Visualise the results
%% These may be a little hard to see using imgshow
%% If you have access, try using imshow(outdisplay) or imagesc(outdisplay)
@ -172,6 +183,6 @@ for i=1:size(dst,1)
img=img(1:81,:,:); % crop image to uniform size vertically (some MSVC images are different heights)
outdisplay=[outdisplay img];
end
figure(2)
figure(3)
imgshow(outdisplay);
axis off;

View File

@ -0,0 +1,51 @@
function F=extractSpatialColour(img)
grid_rows = 10;
grid_columns = 10;
img_size = size(img);
img_rows = img_size(1);
img_cols = img_size(2);
row_divs = [];
for i = 1:grid_rows
row_divs(i) = i/grid_rows;
end
col_divs = [];
for i = 1:grid_columns
col_divs(i) = i/grid_columns;
end
descriptor = [];
%% divide image into sectors as defined grid parameters
for i = 1:grid_rows
for j = 1:grid_columns
% cell row pixel range
row_start = round( (i-1)*img_rows/grid_rows );
if row_start == 0
row_start = 1;
end
row_end = round( i*img_rows/grid_rows );
% cell column pixel range
col_start = round( (j-1)*img_cols/grid_columns );
if col_start == 0
col_start = 1;
end
col_end = round( j*img_cols/grid_columns );
% grab cell from parameters as above
img_cell = img(row_start:row_end, col_start:col_end, :);
%take average values
avg_vals = extractAvgRGB(img_cell);
%concatenate average values into vector
descriptor = [descriptor avg_vals(1) avg_vals(2) avg_vals(3)];
end
end
F=descriptor;
return;

View File

@ -0,0 +1,55 @@
function F=extractSpatialColourTexture(img)
grid_rows = 10;
grid_columns = 10;
img_size = size(img);
img_rows = img_size(1);
img_cols = img_size(2);
row_divs = [];
for i = 1:grid_rows
row_divs(i) = i/grid_rows;
end
col_divs = [];
for i = 1:grid_columns
col_divs(i) = i/grid_columns;
end
descriptor = [];
%% divide image into sectors as defined grid parameters
for i = 1:grid_rows
for j = 1:grid_columns
% cell row pixel range
row_start = round( (i-1)*img_rows/grid_rows );
if row_start == 0
row_start = 1;
end
row_end = round( i*img_rows/grid_rows );
% cell column pixel range
col_start = round( (j-1)*img_cols/grid_columns );
if col_start == 0
col_start = 1;
end
col_end = round( j*img_cols/grid_columns );
% grab cell from parameters as above
img_cell = img(row_start:row_end, col_start:col_end, :);
grey_img_cell = getGreyscale(img_cell);
%take average values
avg_vals = extractAvgRGB(img_cell);
[mag_img, angle_img] = getEdgeInfo(grey_img_cell);
edge_hist = getEdgeAngleHist(mag_img, angle_img);
%concatenate average values into vector
descriptor = [descriptor edge_hist avg_vals(1) avg_vals(2) avg_vals(3)];
end
end
F=descriptor;
return;

6
distance/compareL1.m Normal file
View File

@ -0,0 +1,6 @@
function dst=compareL1(F1, F2)
x=F1-F2;
dst=sum(x);
return;

View File

@ -1,8 +1,10 @@
img = double(imread('dataset/Images/10_10_s.bmp'))./255;
imshow(img);
% imshow(img);
img = getGreyscale(img);
glo = extractGlobalColHist(img);
size(img);
[mag, angle] = getEdgeInfo(img);
F = getEdgeAngleHist(mag, angle)

25
util/getEdgeAngleHist.m Normal file
View File

@ -0,0 +1,25 @@
function F=getEdgeAngleHist(mag_img, angle_img)
bins = 8;
threshold = 0.1;
dimensions = size(angle_img);
rows = dimensions(1);
columns = dimensions(2);
vals = [];
for i = 1:rows
for j = 1:columns
if mag_img(i, j) > threshold
bin_value = angle_img(i, j) / (2 * pi);
bin_value = bin_value * bins;
vals = [vals bin_value];
end
end
end
F= histogram(vals, bins, 'Normalization', 'probability').Values;
return;

18
util/getEdgeInfo.m Normal file
View File

@ -0,0 +1,18 @@
function [mag_img, angle_img]=getEdgeInfo(img)
blur = [1 1 1 ; 1 1 1 ; 1 1 1] ./ 9;
blurredimg = conv2(img, blur, 'same');
Kx = [1 2 1 ; 0 0 0 ; -1 -2 -1] ./ 4;
Ky = Kx';
dx = conv2(blurredimg, Kx, 'same');
dy = conv2(blurredimg, Ky, 'same');
mag_img = sqrt(dx.^2 + dy.^2);
angle_img = atan2(dy,dx);
% normalise between 0 and 2pi
angle_img = angle_img - min(reshape(angle_img, 1, []));
return;

5
util/getGreyscale.m Normal file
View File

@ -0,0 +1,5 @@
function gryimg=getGreyscale(img)
gryimg = img(:,:,1) * 0.3 + img(:,:,2) * 0.59 + img(:,:,3) * 0.11;
return;