Matlab - Recorrer una matriz de 8 en 8

 
Vista:

Recorrer una matriz de 8 en 8

Publicado por Maria (2 intervenciones) el 22/04/2019 19:59:16
Buenas tardes,

Estoy implementando el algoritmo JPEG en Matlab para comprimir imagenes.

Una imagen en color como sabeis, cuando hacemos el imread('Imagen.tif') nos da 3 matrices de dimension 353x629 cada una, en este caso.

Digamos que tenemos
Matriz A, B, C
A cada una de esas matrices tengo que aplicar la DCT (Transformada discreta del coseno), esto no viene ahora al caso pero para que entendais mejor, la DCT funciona mejor si se trabaja con bloques pequeños de 8x8 por ejemplo.

Lo que quiero es recorrer la matriz A (353x629) en bloques de 8x8 para ir aplicando a cada bloque la DCT.

Tengo el codigo para recorrer solo un bloquecito, pero no sabria hacer un bucle for para que una vez acabe con ese bloque de 8x8 pase al siguiente hasta que termine la matriz. Y una vez acabe con la matrix A, lo haga con la B y la C
Os dejo lo que tengo y haber si podeis ayudarme.
Gracias de antemano.

[nfil, ncol] = size(A);
nf=nfil-mod(nfil,8); % para que deje la matriz en una dimension multiplo de 8.
nc=ncol-mod(ncol,8);
A = double(A) - 128;

%bucle para el primer bloque de 8x8:

for i = [1:8:nf] % Bloques de 8 en las filas
for j = [1:8: nc] % (si no es múltiplo de 8 se ignoran las últimas)

Bloq = A(i:i+7, j:j+7); % Uno de los bloques
TB = DCTBloque(Bloq); % Se le aplica la DCT
CuantTB= round(TB./m); %se divide por la matriz m de cuantificación
MatrizComp(i:i+7, j:j+7)= CuantTB ; % hace como el zigzag
end
end
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de David Correa
Val: 497
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Recorrer una matriz de 8 en 8

Publicado por David Correa (1094 intervenciones) el 23/04/2019 04:05:07
Hola;

A continuación estoy colocando de una muestra de código que podría ser de utilidad a los que deseas hacer.


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
% Se crea matrices que representan las capas de las imagenes
A1 = rand(353,629);
B1 = rand(353,629);
C1 = rand(353,629);
 
% Se determina el numero de pixeles el filas y columnas.
[nfil, ncol] = size(A);
 
% Se determina el numero de bloques de multiplos de en las filas y columnas.
nf = floor(nfil/8);
nc = floor(ncol/8);
 
% Matrices temporales para almacenar los resultados de calculo
A2 = A1;
B2 = B1;
C2 = C1;
 
M = 1;      % Valor de cuantificaciones
 
% Recorre la matriz en pequeños bloques de 8 x8
for n = 1:nf
    for m = 1:nc
        % Selecciona los limites de los bloques de 8x8
        nfini = (n-1)*8 + 1;        nffin = (n)*8;
        ncini = (m-1)*8 + 1;        ncfin = (m)*8;
        % Separa los bloques de 8x8 para el procesamiento de DCT
        Ap = A1(nfini:nffin,ncini:ncfin);
        Bp = B1(nfini:nffin,ncini:ncfin);
        Cp = C1(nfini:nffin,ncini:ncfin);
 
        TA = DCTBloque(Ap); % Se le aplica la DCT
        TB = DCTBloque(Bp); % Se le aplica la DCT
        TC = DCTBloque(Cp); % Se le aplica la DCT
        CuantTA = round(TA./M); %se divide por la matriz m de cuantificación
        CuantTB = round(TB./M); %se divide por la matriz m de cuantificación
        CuantTC = round(TC./M); %se divide por la matriz m de cuantificación
 
        A2(nfini:nffin, ncini:ncfin)= CuantTA ; % Debe recorrer todo los elementos de la matriz
        B2(nfini:nffin, ncini:ncfin)= CuantTB ; % Debe recorrer todo los elementos de la matriz
        C2(nfini:nffin, ncini:ncfin)= CuantTC ; % Debe recorrer todo los elementos de la matriz
    end
end

Espero ser de ayuda.

​Saludos
David Correa
Director de Servicios de Programación
E-mail: [email protected]
Web page: https://www.fismatlab.com
Facebook: https://www.facebook.com/fismatlabperu
Blog: http://fismatlab.blogspot.com
Spot: https://www.youtube.com/watch?v=NTDY-MRnFMk
WhatsApp: +51 - 922210488
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar