# Laborator 3 SCCV https://base-n.de/matlab/code_beautifier.html https://typora.io/ https://www.sublimetext.com/ https://www.markdownguide.org/getting-started/ https://www.markdownguide.org/basic-syntax/ ### Aplicatia 1 Lab3 SCCV > Radu - cod netestat (Melania - testat) Iris - modificat acolo la C(m+1,n+1) cu cos in loc de sin ```matlab clear, clc, close all; for N = [4 8] C = zeros(N, N); % N este dimensiunea blocului transformatei DCT % Pentru cazul prezent blocurile sunte de dimensiune 4x4 si 8x8 % Se calculează coeficienţii C for m = 0:1:N-1 for n = 0:1:N-1 if n == 0 k = sqrt (1 / N); else k = sqrt (2 / N); end C(m+1, n+1) = k * cos(((2*m+1)*n*pi) / (N+1)); end end % Se determina funcţiile de baza figure; colormap('gray'); for m = 0:1:N-1 for n = 0:1:N-1 subplot(N, N, m * N + n + 1); Y = [zeros(m, N); zeros(1,n) 1 zeros(1, N - n - 1); zeros(N - m - 1, N)]; X = C * Y * C'; imagesc (X); axis square; axis off; end end end ``` ### Exercitiul 1 Lab 3 SCCV Transformata sin (Iris) ```matlab clear, clc, close all; for N = [4 8] C = zeros(N, N); % N este dimensiunea blocului transformatei DCT % Pentru cazul prezent blocurile sunte de dimensiune 4x4 si 8x8 % Se calculează coeficienţii C for m = 0:1:N-1 for n = 0:1:N-1 k = sqrt (2 / N+1); C(m+1, n+1) = k * sin(((m+1)*(n+1)*pi) / (N+1)); end end % Se determina funcţiile de baza figure; colormap('gray'); for m = 0:1:N-1 for n = 0:1:N-1 subplot(N, N, m * N + n + 1); Y = [zeros(m, N); zeros(1,n) 1 zeros(1, N - n - 1); zeros(N - m - 1, N)]; X = C * Y * C'; imagesc (X); axis square; axis off; end end end ``` ### Aplicatia 2 Lab3 SCCV Pentru 2D-FFT: (Melania - testat) ```matlab clear, clc, close all; x = imread('baboon200_200.jpg'); y = rgb2gray(x); [inaltime, latime] = size(y); Coef = fft2 (y); imshow(log(abs(fftshift(Coef)) + 1), []), colormap(jet (16)), colorbar ``` Pentru 2D-DCT: (Melania - testat) ```matlab x = imread('baboon200_200.jpg'); y = rgb2gray(x); [inaltime, latime] = size(y); Coef = dct2(y); imshow(log(abs(Coef)), []), colormap(jet(16)), colorbar ``` ### Aplicatia 3 Lab3 SCCV > Radu > (Melania - testat) ```matlab function G = TCgain(x, N) % G = TCgain(x) % Se calculeaza castigul codarii cand se aplica 2D-DCT % Variabile de intrare: % x = Imaginea de intensitate % N = dimensiunea blocului de transformare (de regula patratic) % Se obtine la iesire: % G = câştigul de codare in dB raportat la PCM [Height, Width] = size(x); fun = @dct2; Y = blkproc(x, [N N], fun); % Se calc 2D-DCT de dimensiune N x N % Se calculează varianta coeficienţilor DCT CoefVar = zeros(N, N); for i = 1:N for j = 1:N t = std2(Y(i:N:Height, j:N:Width)); CoefVar(i, j) = t * t; end end MeanVar = mean(CoefVar(:));%Media variantei P1 = CoefVar.^(1/(N^2)); GeoMeanVar = prod(P1(:)); % Media geometrica a variantei coeficienţilor G = 10*log10(MeanVar/GeoMeanVar); % Câştigul end ``` Apelarea functiei: (Melania - testat) ```matlab clear, clc, close all; A = imread('baboon.jpg'); % imshow(x) [Height, Width, Depth] = size(A); if Depth == 1 A1 = double(A); else A = double(rgb2ycbcr(A)); A1 = A(:, :, 1); end % figure, imshow(A1, []), title('Baboon'); N = 4; for j = 1:4 G = TCgain(A1, N); sprintf('Castigul codarii pentru %dx%d DCT = %4.2f', N, N, G) N = 2*N end ``` ### Aplicatia 4 Lab 3 SCCV > Denisa - cod netestat > Radu - testat, rescris/corectat ```matlab clear, clc, close all; A = imread('..\PozePrelucrare\lena-256x256.jpg'); imshow(A) [Height,Width,Depth] = size(A); N = 8; % dimensiunea blocului if mod(Height, N) ~= 0 Height = floor(Height/N) * N; end if mod(Width, N) ~= 0 Width = floor(Width/N) * N ; end Al = A(1:Height, 1:Width, :); clear A A = Al; SamplingFormat = '4:2:0'; if Depth == 1 y = double(A); else %Conversie din RGB in YCbCr A = double(rgb2ycbcr(A)); y = A(:,:,1); % Sub-esantionarea imformatiei de crominanta switch SamplingFormat case '4:2:0' Cb = imresize(A(:,:,2),[Height/2 Width/2], 'bicubic'); Cr = imresize(A(:,:,3),[Height/2 Width/2], 'bicubic'); case '4:2:2' Cb = imresize(A(:,1i,2),[Height Width/2], 'bicubic'); Cr = imresize(A(:,:,3),[Height Width/2], 'bicubic'); end end % Matrice de cuantizare informaţie luminanta jpgQstepsY = [16 11 10 16 24 40 51 61;... 12 12 14 19 26 58 60 55;... 14 13 16 24 40 57 69 56;... 14 17 22 29 51 87 80 62;... 18 22 37 56 68 109 103 77;... 24 35 55 64 81 104 113 92;... 49 64 78 87 103 121 120 101;... 72 92 95 98 112 100 103 99]; QstepsY = jpgQstepsY; Qscale = 1.5; Yy = zeros(N,N); xqY = zeros(Height,Width); acBitsY = 0; dcBitsY = 0; if Depth > 1 jpgQstepsC = [17 18 24 47 66 99 99 99;... 18 21 26 66 99 99 99 99;... 24 26 56 99 99 99 99 99;... 47 66 99 99 99 99 99 99;... 99 99 99 99 99 99 99 99;... 99 99 99 99 99 99 99 99;... 99 99 99 99 99 99 99 99;... 99 99 99 99 99 99 99 99]; QstepsC = jpgQstepsC; YCb = zeros(N,N); YCr = zeros(N,N); switch SamplingFormat case '4:2:0' xqCb = zeros(Height/2, Width/2); xqCr = zeros(Height/2, Width/2); case '4:2:2' xqCb = zeros(Height, Width/2); xqCr = zeros(Height, Width/2); end acBitsCb = 0; dcBitsCb = 0; acBitsCr = 0; dcBitsCr = 0; end % 5e calculează cuvinetele de cod asociate fiecărei componente % Pentru componenta de luminanta for m = 1:N:Height for n = 1:N:Width t = y(m:m+N-1,n:n+N-1)-128; Yy = dct2(t); % Se aplica transformata DCT/2D pentru blocuri % de dimensiune N x N % Se cuantizeaza coeficienţii DCT temp = floor(Yy ./ (Qscale*QstepsY) + 0.5); % Se calculează biţii de cod pentru diferentele DC if n == 1 DC = temp(1,1); dcBitsY = dcBitsY + jpgDCbits(DC, 'Y'); else DC = temp(1,1) - DC; dcBitsY = dcBitsY + jpgDCbits(DC, 'Y'); DC = temp(1,1); end % Se calculează biţii de cod pentru coeficienţii AC ACblkBits = jpgACbits(temp,'Y'); acBitsY = acBitsY + ACblkBits; % Se decuantizeaza coeficienţii si se calculează IDCT xqY(m:m+N-1,n:n+N-1)= idct2(temp.*(Qscale*QstepsY))+ 128; end end % Daca imaginea aplicata la intrare este color % se calculează biţii de cod pentru componentele de crominanta if Depth > 1 if strcmpi(SamplingFormat,'4:2:0') EndRow = Height/2; else EndRow = Height; end for m = 1:N:EndRow for n = 1:N:Width/2 tl = Cb(m:m+N-1,n:n+N-1) - 128; t2 = Cr(m:m+N-1,n:n+N-1) - 128; Ycb = dct2(tl); % Transformata DCT de dimensiune N x N Ycr = dct2(t2); temp1 = floor(Ycb ./ (Qscale*QstepsC) + 0.5); temp2 = floor(Ycr ./ (Qscale*QstepsC) + 0.5); if n == 1 DC1 = temp1(1, 1); DC2 = temp2(1, 1); dcBitsCb = dcBitsCb + jpgDCbits(DC1, 'C'); dcBitsCr = dcBitsCr + jpgDCbits(DC2, 'C'); else DC1 = temp1(1,1) - DC1; DC2 = temp2(1,1) - DC2; dcBitsCb = dcBitsCb + jpgDCbits(DC1, 'C'); dcBitsCr = dcBitsCr + jpgDCbits(DC2, 'C'); DC1 = temp1(1,1); DC2 = temp2(1,1); end ACblkBitsl = jpgACbits(temp1, 'C'); ACblkBits2 = jpgACbits(temp2, 'C'); acBitsCb = acBitsCb + ACblkBitsl; acBitsCr = acBitsCr + ACblkBits2; % Decuantizarea coeficienţilor si aplicarea IDCT xqCb(m:m+N-1,n:n+N-1)= idct2(temp1 .* (Qscale*QstepsC))+ 128; xqCr(m:m+N-1,n:n+N-1)= idct2(temp2 .* (Qscale*QstepsC))+ 128; end end end mse = std2(y - xqY); snr = 20 * log10(std2(y) / mse); fprintf('SNR = %4.2f\n', snr) if Depth == 1 TotalBits = acBitsY + dcBitsY; figure, imshow(xqY, []) title(['JPG compressed ' '@ ' num2str(TotalBits/(Height*Width)) 'bpp']) else TotalBits = acBitsY + dcBitsY + dcBitsCb +... acBitsCb + dcBitsCr + acBitsCr; cl = imresize(xqCb,[Height Width], 'bicubic'); c2 = imresize(xqCr,[Height Width], 'bicubic'); mseb = std2(A(:,:,2) - cl); snrb = 20*log10(std2(A(:,:,2)) / mseb); msec = std2(A(:,:,3) - c2); snrc = 20*log10(std2(A(:,:,3)) / msec); fprintf('SNR(Cb)=%4.2fdB\tSNR(Cr)=%4.2fdB\n',snrb,snrc) xq(:,:,1) = xqY; xq(:,:,2) = cl; xq(:,:,3) = c2; figure, imshow(ycbcr2rgb(uint8(round(xq)))) title(['JPG compressed ' '@' num2str(TotalBits/(Height *Width)) ' bpp']) end fprintf('Bit rate = %4.2f bpp\n', TotalBits/(Height*Width)) ``` Functii aplicatia 4 > Madalin - cod testat ```matlab function Bits = jpgDCbits(dc,C) %Determina numarul exact de biti necesar codarii entropice pentru %coeficientii DC ce au fost codati deferential in cursul codarii JPEG %ce utilizeaza tabelele predefinite Huffman %Variabile de intrare: %dc - valorile prezise pt coef DC %C = 'Y' pentru luminanta si 'C' pt crominanta %Variabile la iesire: %Nr de biti aferent codarii diferentiale %CodeLengthY contine lung cuvintelor de cod pt luminanta DC diff pt categ %de la 0 la 11 inclusiv %CodeLengthC contine lung cuvintelor de cod pt crominanta DC CodeLengthY = int16([3 4 5 5 7 8 10 12 14 16 18 20]); CodeLengthC = int16([3 4 5 6 7 9 11 13 15 18 19 20]); switch C case 'Y' CodeLength = CodeLengthY; case 'C' CodeLength = CodeLengthC; end if dc==0 Bits = double(CodeLength(1)); else Bits = double(CodeLength(round(log2(abs(dc))+0.5)+1)); end ``` ```matlab function Bits = jpgACbits(x,C) RLCy = cell(1,15); RLCy{1} = int16([4 3 4 6 8 10 12 14 18 25 26]); RLCy{2} = int16([5 8 10 13 16 22 23 24 25 26]); RLCy{3} = int16([6 10 13 20 21 22 23 24 25 26]); RLCy{4} = int16([7 11 14 20 21 22 23 24 25 26]); RLCy{5} = int16([7 12 19 20 21 22 23 24 25 26]); RLCy{6} = int16([8 12 19 20 21 22 23 24 25 26]); RLCy{7} = int16([8 13 19 20 21 22 23 24 25 26]); RLCy{8} = int16([9 13 19 20 21 22 23 24 25 26]); RLCy{9} = int16([9 17 19 20 21 22 23 24 25 26]); RLCy{10} = int16([10 18 19 20 21 22 23 24 25 26]); RLCy{11} = int16([10 18 19 20 21 22 23 24 25 26]); RLCy{12} = int16([10 18 19 20 21 22 23 24 25 26]); RLCy{13} = int16([11 18 19 20 21 22 23 24 25 26]); RLCy{14} = int16([12 18 19 20 21 22 23 24 25 26]); RLCy{15} = int16([13 18 19 20 21 22 23 24 25 26]); RLCy{16} = int16([12 17 18 19 20 21 22 23 24 25 26]); RLCc = cell(1,15); RLCc{1} = int16([2 3 5 7 9 12 15 23 24 25 26]); RLCc{2} = int16([5 8 11 14 20 22 23 24 25 26]); RLCc{3} = int16([6 9 13 15 21 22 23 24 25 26]); RLCc{4} = int16([6 9 12 15 21 22 23 24 25 26]); RLCc{5} = int16([6 10 14 20 21 22 23 24 25 26]); RLCc{6} = int16([7 11 17 20 21 22 23 24 25 26]); RLCc{7} = int16([8 12 19 20 21 22 23 24 25 26]); RLCc{8} = int16([7 12 19 20 21 22 23 24 25 26]); RLCc{9} = int16([8 14 19 20 21 22 23 24 25 26]); RLCc{10} = int16([9 14 19 20 21 22 23 24 25 26]); RLCc{11} = int16([9 14 19 20 21 22 23 24 25 26]); RLCc{12} = int16([9 14 19 20 21 22 23 24 25 26]); RLCc{13} = int16([9 18 19 20 21 22 23 24 25 26]); RLCc{14} = int16([11 18 19 20 21 22 23 24 25 26]); RLCc{15} = int16([13 18 19 20 21 22 23 24 25 26]); RLCc{16} = int16([11 17 18 19 20 21 22 23 24 25 26]); switch C case 'Y' RLC = RLCy; case 'C' RLC = RLCc; end x1 = ZigZag(x); k=2; Count = 0; Bits = double(0); while k<= 64 if x1(k) == 0 Count = Count + 1; if k == 64 Bits = Bits + double(RLC{1}(1)); break; end else if Count == 0 RL = Count; Level = round(log2(abs(x1(k)))+0.5); Bits = Bits + double(RLC{RL+1}(Level+1)); elseif Count >=1 && Count <=15 RL = Count; Level = round(log2(abs(x1(k)))+0.5); Bits = Bits + double(RLC{RL+1}(Level)); Count = 0; else Bits = Bits + double(RLC{16}(1)); Count = Count - 16; end end k = k+1; end end ``` ```matlab function y = ZigZag(x) % Returneaza adresele scanate in zig-zag ale coef 8x8 dintr-o matrice y(1) = x(1, 1); y(2) = x(1, 2); y(3) = x(2, 1); y(4) = x(3, 1); y(5) = x(2, 2); y(6) = x(1, 3); y(7) = x(1, 4); y(8) = x(2, 3); y(9) = x(3, 2); y(10) = x(4, 1); y(11) = x(5, 1); y(12) = x(4, 2); y(13) = x(3, 3); y(14) = x(2, 4); y(15) = x(1, 5); y(16) = x(1, 6); y(17) = x(2, 5); y(18) = x(3, 4); y(19) = x(4, 3); y(20) = x(5, 2); y(21) = x(6, 1); y(22) = x(7, 1); y(23) = x(6, 2); y(24) = x(5, 3); y(25) = x(4, 4); y(26) = x(3, 5); y(27) = x(2, 6); y(28) = x(1, 7); y(29) = x(1, 8); y(30) = x(2, 7); y(31) = x(3, 6); y(32) = x(4, 5); y(33) = x(5, 4); y(34) = x(6, 3); y(35) = x(7, 2); y(36) = x(8, 1); y(37) = x(8, 2); y(38) = x(7, 3); y(39) = x(6, 4); y(40) = x(5, 5); y(41) = x(4, 6); y(42) = x(3, 7); y(43) = x(2, 8); y(44) = x(3, 8); y(45) = x(4, 7); y(46) = x(5, 6); y(47) = x(6, 5); y(48) = x(7, 4); y(49) = x(8, 3); y(50) = x(8, 4); y(51) = x(7, 5); y(52) = x(6, 6); y(53) = x(5, 7); y(54) = x(4, 8); y(55) = x(5, 8); y(56) = x(6, 7); y(57) = x(7, 6); y(58) = x(8, 5); y(59) = x(8, 6); y(60) = x(7, 7); y(61) = x(6, 8); y(62) = x(7, 8); y(63) = x(8, 7); y(64) = x(8, 8); end ``` --- # Laborator 4 SCCV ### Aplicatia 1 (L4 SCCV) ```matlab clear all, close all, clc; A = [2 2; -1 1]; [U S V] = svd(A); ``` ### Aplicatia 2 (L4 SCCV) ```matlab clear all, close all, clc; imfinfo('lena_256x256_BW.bmp') [A, map] = imread ('lena_256x256_BW.bmp'); Ad = im2double (A); figure('Name', 'Imaginea originala'), imshow(A); [U, S, V] = svd(Ad); C = zeros(size (Ad)); k = 5; for j = 1:k C = C + U(:, j) * S(j, j) * V(:, j)'; end X = uint8(255*C); figure('Name', 'Imaginea reconstruita'), imshow (X); filename = fullfile(pwd, ['LenaComprimata', num2str(k), '.bmp']); imwrite(X, filename) ``` ### Aplicatia 3 (L4 SCCV) (Melania - testat) ```matlab clear all, close all, clc; %Se citeste imaginea color Lena_color.png figure('Name', 'Imaginea originala RGB') L=imread('lena_color_512x512.bmp'); imshow(L) %Se descompune imaginea in cele trei plane de culoare corespunzătoare L1=L(:,:,1); L2=L(:,:,2); L3=L(:,:,3); %Se convertesc valorile pixelilor din int in dubla precizie I1=im2double(L1); I2=im2double(L2); I3=im2double(L3); %Se afiseaza cele trei plane de culoare figure('Name','Componenta de roşu') imshow(I1) figure('Name','Componenta de verde') imshow(I2) figure('Name','Componenta de albastru') imshow(I3) %Se calculează descompunerea SVD pentru cele trei matrice [u1,s1,v1]=svd(I1); [u2,s2,v2]=svd(I2); [u3,s3,v3]=svd(I3); %Se creaza trei matrice Cl, C2 si C3 ce se umplu initial cu zerouri C1=zeros(size(I1)); C2=zeros(size(I2)); C3=zeros(size(I3)); %Setarea numărului de valori singulare nenule considerate pentru %descompunere k=100; %Se reconstruiesc imaginile pe baza valorilor singulare for j=1:k C1=C1+u1(:,j)*s1(j,j)*v1(:,j).'; C2=C2+u2(:,j)*s2(j,j)*v2(:,j).'; C3=C3+u3(:,j)*s3(j,j)*v3(:,j).'; end %Afisarea imaginilor comprimate pe fiecare componenta de culoare figure('Name','Componenta de roşu reconstruita') imshow(C1) figure('Name','Componenta de verde reconstruita') imshow(C2) figure('Name','Componenta de albastru reconstruita') imshow(C3) %Se convertesc valorile matricelor la intregi, fara semn reprezentaţi pe %8 bits R1=im2uint8(C1); R2=im2uint8(C2); R3=im2uint8(C3); %Se creeaza o imagine Q ce are cate o componenta de culoare reprezentata de %matricele Rl, R2, R3 Q(:,:,1)=R1; Q(:,:,2)=R2; Q(:,:,3)=R3; %Afisarea imaginii finale comprimata figure('Name', ' Imaginea color reconstruita') imshow(Q,[]) ``` --- # Laborator 5 SCCV Melania Va rog verificati! Am adaugat un "end" la sfarsit! > `./main.m` ```matlab clear close all clc A = imread('rino1.bmp'); % frame #1 - cadrul de referinţa B = imread('rino2.bmp'); % frame #2 cadrul curent N = 8; % Blocuri de dimensiune N x N pixeli W = 16; % Dimensiunea ferestrei de cautare W x W pixeli [x,y,ep,BRec] = MC_CautareCompleta(A,B,N,W); C = double(B) - double(A); figure, imshow(ep,[]), title('Predictia cadrului cu compensare de miscare') figure, imshow(C, []), title('Predictia cadrului fara compensare de miscare') ``` > `./MC_CautareCompleta.m` ```matlab function[x, y, ep, BRec] = MC_CautareCompleta(A,B,N,W) % funcţia calculează vectorii de mişcare pentru fiecare NxN bloc din % imagine folosind tehnica de cautare completa % x - componenta orizontala a vectorului de mişcare % y - componenta verticala a vectorului de mişcare % ep - eroarea de predictie % BRec - imaginea reconstruita pe baza vectorilor de mişcare [Height,Width] = size (A); % se completează cadrul de referinţei la stanga, dreapta, sus si jos cu % pixeli pentru a ne asigura ca blocul de analiza se gaseste Întotdeauna in % centrul ferestrei de cautare, chiar si pentru blocurile aflate pe margine A1 = double(padarray(A,[(W-N)/2 (W-N)/2], 'replicate' )); B1 = double(B); x = (zeros(Height/N,Width/N)); y = (zeros(Height/N,Width/N)); Xpoz = (zeros(Height/N,Width/N)); Ypoz = (zeros(Height/N,Width/N)); figure, imshow(B), title('Vectorii de miscare') hold on t1 = cputime; % start CPU time for r = 1:N:Height rblk = floor(r/N) + 1; for c = 1:N:Width cblk = floor(c/N) + 1; D = 1.0e+10;% distanta maxima intre doua blocuri for u = -(W-N)/2:(W-N)/2 for v = -(W-N)/2:(W-N)/2 d = B1(r:r+N-1,c:c+N-1)-A1(r+u+(W-N)/2:r+u+(W-N)/2+N-1,c+v+(W-N)/2:c+v+(W-N)/2+N-1); d = sum(abs(d(:))); if d < D D = d; x(rblk, cblk) = v; y(rblk, cblk); end end end Xpoz(rblk, cblk) = c + N/2; Ypoz(rblk, cblk) = r + N/2; end end t2 = cputime; % end CPU time quiver(Xpoz, Ypoz, x, y, 'r','LineWidth', 1); hold off % Reconstruieşte cadrul curent utilizând cadrul de referinţa si ve%orii de % mişcare BRec = double(zeros(Height,Width)); % cadrul reconstruit ep = double(zeros(Height,Width)); % eroarea de predictie for r = 1:N:Height rblk = floor(r/N) + 1; for c=1:N:Width cblk = floor(c/N) + 1; x1 = x(rblk, cblk); y1 = y(rblk, cblk); BRec(r:r+N-1,c:c+N-1) = A1(r+y1+(W-N)/2:r+y1+(W-N)/2+N-1,c+x1+(W-N)/2:c+x1+(W-N)/2+N-1); ep(r:r+N-1,c:c+N-1) = B1(r:r+N-1,c:c+N-1) - BRec(r:r+N-1,c:c+N-1); end end end ```