Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Interazione e Multimedia, 9 CFU => Topic started by: TheSpecialOne on 12-02-2010, 17:20:19



Title: Ricomporre un'immagine suddivisa precedentemente
Post by: TheSpecialOne on 12-02-2010, 17:20:19
Salve a tutti, oggi, cercando di risolvere un (apparentemente) banale esercizio, ho riscontrato un bel problema!
L'esercizio in questione chiedeva di suddividere l'immagine in 4 quadranti, e applicare rispettivamente:
1°: Negativo
2°: Schiarimento
3°: Scurimento
4°: Equalizzazione
Naturalmente supposta l'immagine a toni di grigio

L'idea è stata di creare 4 sottomatrici e ad esse applicare le operazioni richieste.
Una volta eseguite le operazioni sulle sottomatrici, cerco di ricostruire l'immagine intera, ma non ci riesco!


Per farvi capire meglio il problema, posto il mio codice:

Code:
% LUT's (Negativo, schiarimento, incupimento, equalizzazione)

A=double(rgb2gray(imread('lena.jpg')));
figure,imshow(A,[]),title 'Originale';

[M,N]=size(A);
NEW=zeros(size(A));
gammaC=0.2;
gammaS=3.0;
M2=floor(M/2);
N2=floor(N/2);

% Separo i 4 quadranti e li processo separatamente
[X,Y]=size(B);
B=A(1:M2,1:N2);
C=A(1:M2,N2:N);
D=A(M2:M,1:N2);
E=A(M2:M,N2:N);
C=double(C);
D=double(D);
E=uint8(E);

for i=1:X
    for j=1:Y
        BB(i,j)=255-B(i,j);
        CC(i,j)=C(i,j).^gammaC;
        DD(i,j)=D(i,j).^gammaS;
    end
end
EE=histeq(E);
figure,imshow(BB,[]),title 'Negativo';
figure,imshow(CC,[]),title 'Schiarimento';
figure,imshow(DD,[]),title 'Scurimento';
figure,imshow(EE,[]),title 'Equalizzazione';

%Ricostruisco il primo quadrante
for i=1:M2
    for j=1:N2
        NEW(i,j)=BB(i,j);
    end
end

%Ricostruisco il secondo quadrante
ii=0;
jj=0;
for i=1:M2
    ii=ii+1;
    for j=N2+1:N
        jj=jj+1;
        NEW(i,j)=NEW(i,j)+CC(ii,jj);
    end
    jj=0;
end


figure,imshow(NEW,[]);

Per semplicità ho omesso la ricostruzione degli altri 2 quadranti.
L'immagine è stata caricata nella matrice A.
Dopodichè ho creato 4 sottomatrici B,C,D,E e le ho processate dentro un ciclo for, restituendo in BB,CC,DD,EE i risultati voluti.
Ho creato la matrice NEW, formata da zeri, e delle dimensioni di A.
Ho cercato poi di 'riunire' le 4 matrici, ma mi riesce correttamente solo con il primo quadrante, quello del negativo.

Spero qualcuno possa darmi una mano


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: Vitocr on 12-02-2010, 17:31:20
secondo me per ricostruire i quadranti potresti utilizzare questa istruzione:

Code:
NEW(1:m,1:n)= [BB CC; DD EE];



spero sia giusto!!!! .ciaociao


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: TheSpecialOne on 12-02-2010, 17:47:33
Appena provato, non và  :-)| :-)|


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: TheSpecialOne on 12-02-2010, 18:24:45
secondo me per ricostruire i quadranti potresti utilizzare questa istruzione:

Code:
NEW(1:m,1:n)= [BB CC; DD EE];



spero sia giusto!!!! .ciaociao

Ho risolto! L'operazione era simile a quella che mi hai consigliato, cioè;
Code:
NEW=[BB CC;DD EE];

Ora ,però, mi ritrovo problemi con il casting e il riscalaggio delle immagini dei quadranti due e tre (quelle processate in double per intenderci)


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: TheSpecialOne on 12-02-2010, 18:36:45
Tutto risolto  :yoh
Se a qualcuno interessa, posso postare il codice.


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: Vitocr on 12-02-2010, 21:21:11
quando si posta del codice nn si sbaglia mai!!!!!!!! .whistling
 .ciaociao


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: TheSpecialOne on 12-02-2010, 23:02:16
eccolo, con un ringraziamento per la brillante idea fornita  :-OK
Code:
% LUT's (Negativo, schiarimento, incupimento, equalizzazione)

A=double(rgb2gray(imread('lena.jpg')));
figure,imshow(A,[]),title 'Originale';


[M,N]=size(A);
NEW=double(zeros(size(A)));
gammaC=0.2;
gammaS=3.0;
M2=floor(M/2);
N2=floor(N/2);


% Separo i 4 quadranti e li processo separatamente
B=A(1:M2,1:N2);
C=A(1:M2,N2:N);
D=A(M2:M,1:N2);
E=A(M2:M,N2:N);
[X,Y]=size(B);
C=double(C);
D=double(D);
E=uint8(E);
CC=double(zeros(size(C)));
DD=double(zeros(size(D)));

for i=1:X
    for j=1:Y
        BB(i,j)=255-B(i,j);
        CC(i,j)=C(i,j).^gammaC;
        DD(i,j)=D(i,j).^gammaS;
    end
end
EE=histeq(E);


% Normalizzo CC & DD
temp=CC;
temp=temp-min(min(CC));
temp=temp*256/(max(max(temp)));
CC=temp;

temp=DD;
temp=temp-min(min(DD));
temp=temp*256/(max(max(temp)));
DD=temp;


% Concateno le sottomatrici BB CC DD EE in NEW
NEW=[BB CC; DD EE];
figure,imshow(NEW,[]),title 'Modificata';


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: Vitocr on 13-02-2010, 17:00:38
solo per curiosità.....ma l'istruzione che t avevo suggerito non funziona perkè nel tuo codice c'è un errore e precisamente è:


Code:
% Separo i 4 quadranti e li processo separatamente
B=A(1:M2,1:N2);
C=A(1:M2,N2:N);
D=A(M2:M,1:N2);
E=A(M2:M,N2:N);

devi aggiungere +1 a

N2:N
M2:M
M2:N
N2:N

quindi il codice esatto è:

Code:
% Separo i 4 quadranti e li processo separatamente
B=A(1:M2,1:N2);
C=A(1:M2,N2+1:N);
D=A(M2+1:M,1:N2);
E=A(M2+1:M,N2+1:N);

e alla fine potrai fare

Code:
NEW(1:M,1:N)=[BB CC; DD EE];

  .wink .ciaociao




Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: Vivynz on 14-02-2010, 12:47:22
io ho fatto lo stesso esercizio non separando le 4 immagini ma utilizzando gli indici..e le funzioni predefinite di matlab anche se a queste si possono sostituire i "procedimenti manuali"
Code:
%supponiamo il primo quadrante quello in alto a sinistra e gli altri
% a seguire in senso orario
clear all
close all
I=rgb2gray(imread('lena.jpg'));
[m,n]=size(I);
A=zeros(m,n);
%primo
A(1:round(m/2),1:round(n/2))=imadjust(I(1:round(m/2),1:round(n/2)),[0 1],[1 0]);
%secondo
A(1:round(m/2),(round(n/2)+1):n)=imadjust(I(1:round(m/2),(round(n/2)+1):n),[0 1],[0 1],0.2);
% terzo
A((round(m/2)+1):m,(round(n/2)+1):n)=imadjust(I((round(m/2)+1):m,(round(n/2)+1):n),[0 1],[0 1],2);
% quarto
A((round(m/2)+1):m,1:round(n/2))=histeq(I((round(m/2)+1):m,1:round(n/2)));

figure, subplot(121),imshow(I,[]),title('originale');
subplot(122),imshow(A,[]),title('processata');


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: TheSpecialOne on 14-02-2010, 13:30:56
io ho fatto lo stesso esercizio non separando le 4 immagini ma utilizzando gli indici..e le funzioni predefinite di matlab anche se a queste si possono sostituire i "procedimenti manuali"
Code:
%supponiamo il primo quadrante quello in alto a sinistra e gli altri
% a seguire in senso orario
clear all
close all
I=rgb2gray(imread('lena.jpg'));
[m,n]=size(I);
A=zeros(m,n);
%primo
A(1:round(m/2),1:round(n/2))=imadjust(I(1:round(m/2),1:round(n/2)),[0 1],[1 0]);
%secondo
A(1:round(m/2),(round(n/2)+1):n)=imadjust(I(1:round(m/2),(round(n/2)+1):n),[0 1],[0 1],0.2);
% terzo
A((round(m/2)+1):m,(round(n/2)+1):n)=imadjust(I((round(m/2)+1):m,(round(n/2)+1):n),[0 1],[0 1],2);
% quarto
A((round(m/2)+1):m,1:round(n/2))=histeq(I((round(m/2)+1):m,1:round(n/2)));

figure, subplot(121),imshow(I,[]),title('originale');
subplot(122),imshow(A,[]),title('processata');
anche questa è stata una buona idea!
io ho rispolverato certi comandi poco utilizzati, con la scusa dell'esercizio!


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: Vivynz on 14-02-2010, 13:33:00
speriamo di averle domani le buone idee  :[Emoticon] Asd:


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: Antoniods on 14-02-2010, 16:33:17
speriamo di averle domani le buone idee  :[Emoticon] Asd:
.quoto .quoto .quoto


Title: Re:Ricomporre un'immagine suddivisa precedentemente
Post by: TheSpecialOne on 14-02-2010, 17:06:12
speriamo di averle domani le buone idee  :[Emoticon] Asd:
stavo per dirlo io!