Crea sito

Matlab

[Matlab] Test invarianza rispetto alla scala del filtro Gaussiano-Laplaciano mediante DoG

Written by  on luglio 12, 2014

%% Scale-invariance using Laplacian and DoG operators
% Implementazione di Illuminato Luca Costantino per Computer Vision

clear all;
close all;
img = imread(‘einstein.jpg’);
img_ridotta = imresize(img, 0.5);
fixed_location = [186 148];

dxx = [1 -2 1];
dyy = [1 -2 1]’;

sigma = 3;

% location 186,148
valori = zeros(31,5);
i = 1;
for(i=1:31)
% costruzione del filtro LoG e LoG normalizzato al variare di sigma
sigma = 2.6 + i*0.4;
GS = fspecial(‘gaussian’,round(6*sigma), sigma);
GSxx = conv2(GS,dxx,’valid’);
GSyy = conv2(GS,dyy,’valid’);
rect = [1 1 15 15];
GSxx = imcrop(GSxx,rect);
GSyy = imcrop(GSyy,rect);
laplacian_of_gaussian = GSxx + GSyy; % LoG non normalizzato
sn_lg = sigma^2 * laplacian_of_gaussian; % LoG normalizzato per la scala

%% applico i due filtri alle due immagini e salvo i valori della locazione indicata

img_filt = conv2(img,laplacian_of_gaussian); % immagine grande con LoG
img_filt_norm = conv2(img,sn_lg); % immagine grande con LoG normalizzato
img_ridotta_filt = conv2(img_ridotta,laplacian_of_gaussian); % immagine piccola con LoG
img_ridotta_filt_norm = conv2(img_ridotta,sn_lg); % immagine piccola con LoG normalizato

valori(i,:) = [sigma img_filt(186,148) img_ridotta_filt(93,74) img_filt_norm(186,148) img_ridotta_filt_norm(93,74)];

end

figure(‘Name’,’Esercizio 3′);
subplot(2,2,1);
h1 = plot(valori(:,1),valori(:,2),’color’,’r’); hold on
h2 = plot(valori(:,1),valori(:,3),’color’,’b’);
title(‘LoG’);
legend([h1 h2],{‘Immagine’, ‘Immagine Ridotta’});
xlabel(‘sigma’);
subplot(2,2,2);
h1 = plot(valori(:,1),valori(:,4),’color’,’r’); hold on
h2 = plot(valori(:,1),valori(:,5),’color’,’b’);
title(‘LoG Normalizzato’);
legend([h1 h2],{‘Immagine’, ‘Immagine Ridotta’});
xlabel(‘sigma’);
% prima immagine
subplot(2,2,3);
imshow(img); hold on
%e
r= max(valori(:,4));
x = 148;
y = 186;
th = 0:pi/50:2*pi;
xunit = r * cos(th) + x;
yunit = r * sin(th) + y;
h = plot(xunit, yunit,’color’,’y’);

title(‘Einstein’);
% seconda immagine
subplot(2,2,4);
imshow(img_ridotta); hold on
%e
r= max(valori(:,5));
x = 74;
y = 93;
th = 0:pi/50:2*pi;
xunit = r * cos(th) + x;
yunit = r * sin(th) + y;
h = plot(xunit, yunit,’color’,’y’);

title(‘Einstein 50%’);

einstein

[Matlab] Coloriamo le foto di Prokudin

Written by  on luglio 12, 2014

Update: ho creato una GUI per questo genere di attività (vedi Github)

https://it.wikipedia.org/wiki/Sergej_Michajlovi%C4%8D_Prokudin-Gorskij

 

% Esercizio 1: colorazione di foto mediante finestra di shift
% Implementazione di Illuminato Luca Costantino per Computer Vision

clear all;
close all;

% faccio scegliere all’utente il file e la modalità da usare
[img_input, pathname] = …
uigetfile({‘*.jpg’;’*.gif’;’*.png’;’*.tiff’},’File Selector’);

mode = 0; % automatico
% imname = ‘part1_4′; % name of the input file

%% Seguiamo i suggerimenti scritti nel file allegato all’assignment

%img_input = strcat(imname,’.jpg’);
fullim = imread(img_input); % read in the image
fullim = im2double(fullim); % convert to double matrix
height = floor(size(fullim,1)/3); % compute the height of each part (just 1/3 of total)
% separate color channels
B = fullim(1:height,:);
G = fullim(height+1:height*2,:);
R = fullim(height*2+1:height*3,:);

shift_riga_rossa_stringa = ”;
shift_colonna_rossa_stringa = ”;
shift_riga_verde_stringa = ”;
shift_colonna_verde_stringa = ”;

if(mode == 1)
[patch,rect_patch] = imcrop(B); % selezione manuale
%     figure(‘Name’,’Patch scelta’);imshow(patch);
% ROSSO
c = normxcorr2(patch,R);
[ypeak, xpeak] = find(c==max(c(:)));
yoffSet = ypeak-size(patch,1);
xoffSet = xpeak-size(patch,2);
shift_x = uint8(rect_patch(1)-xoffSet);
shift_y = uint8(rect_patch(2)-yoffSet);
R = circshift(R,[shift_y shift_x]);

% VERDE
c = normxcorr2(patch,G);
[ypeak, xpeak] = find(c==max(c(:)));
yoffSet = ypeak-size(patch,1);
xoffSet = xpeak-size(patch,2);
shift_x = uint8(rect_patch(1)-xoffSet);
shift_y = uint8(rect_patch(2)-yoffSet);
G = circshift(G,[shift_y shift_x]);
rgb_img = cat(3,R,G,B);

else if (mode == 0)
ssd_minimo = 0;
finestra = 10;
for shift_riga = -finestra:finestra
for shift_colonna = -finestra:finestra
immagine_shiftata = circshift(single(R), [shift_riga, shift_colonna]);
ssd_tmp = sum(sum((immagine_shiftata – B).^2));
if ssd_minimo == 0 % direttamente posso sostituire il valore
ssd_minimo = ssd_tmp;
R_spostato = immagine_shiftata;
shift_riga_rossa_stringa = num2str(shift_riga);
shift_colonna_rossa_stringa = num2str(shift_colonna);
else if ssd_tmp < ssd_minimo % aggiorno l’SSD
ssd_minimo = ssd_tmp;
R_spostato = immagine_shiftata;
shift_riga_rossa_stringa = num2str(shift_riga);
shift_colonna_rossa_stringa = num2str(shift_colonna);
end
end
end
end
% faccio lo stesso per il canale verde
for shift_riga = -finestra:finestra
for shift_colonna = -finestra:finestra
immagine_shiftata = circshift(single(G), [shift_riga, shift_colonna]);
ssd_tmp = sum(sum((immagine_shiftata – B).^2));
if ssd_minimo == 0 % direttamente posso sostituire il valore
ssd_minimo = ssd_tmp;
G_spostato = immagine_shiftata;
shift_riga_verde_stringa = num2str(shift_riga);
shift_colonna_verde_stringa = num2str(shift_colonna);
else if ssd_tmp < ssd_minimo % aggiorno l’SSD
ssd_minimo = ssd_tmp;
G_spostato = immagine_shiftata;
shift_riga_verde_stringa = num2str(shift_riga);
shift_colonna_verde_stringa = num2str(shift_colonna);
end
end
end
end
rgb_img = cat(3,R_spostato,G_spostato,B);
end
end

% % output
figure(‘Name’,’Immagine Shiftata’);
imshow(rgb_img);
title(strcat(‘Shift rosso=(‘,shift_riga_rossa_stringa,’,’,shift_colonna_rossa_stringa,’) Shift verde=(‘,shift_riga_verde_stringa,’,’,shift_colonna_verde_stringa,’)’));
imwrite(rgb_img,strcat(‘output_’,img_input),’jpeg’);

output_imm1_con_shift output_imm2_con_shift output_imm3_con_shift output_imm4_con_shift output_imm5_con_shift output_imm6_con_shift part1_1 part1_2 part1_3 part1_4 part1_5 part1_6