procesamiento digital de imágenes y la imagen de compresión Matlab- transformada discreta del coseno (con código)

1.Objectives:

1, entender el concepto de compresión sin pérdidas y compresión con pérdida;
2, entiende que los principios y fines de compresión de imágenes;
3, la compresión de imágenes utilizando el programa MATLAB.
4, características de aprendizaje que transformada discreta DCT e implementación.

Contenido 2.Experiment:

1, compresión de imágenes utilizando el programa Matlab, aprender mat2huff, huff2mat, mat2lpc, lpc2mat, im2jpeg, jpeg2im, entropía, imratio, comparar su uso.
2, bloque de programación de transformar la imagen DCT discretas y dominio de la frecuencia de filtrado para lograr

3.Experiment Principio:

Ver el libro.

4.Experiment Pasos de Resultados y conlusion:

1, mat2lpc operación, lpc2mat, entropía, imratio, comparar otras funciones, para entender la función y características.

Aquí Insertar imagen Descripción
Aquí Insertar imagen DescripciónConv: mat2lpc usando eliminación de redundancia espacial de codificación de imágenes, la imagen de decodificación usando lpc2mat. Se utiliza la imagen y función de entropía nrtop calcular la entropía de codificación antes y después, y se puede ver una reducción de la entropía. Finalmente imratio continuación, calcula la relación de compresión, calculada por el error comparar se encuentra 0, es decir, una transmisión de la imagen perfecta.

NOTA:
Fuera = Entropy (la Img) su significado físico: Si un gráfico (o un conjunto de números) hay n valores diferentes, la relación entre el valor de cada estación es P (i), i = 1 , ..., n
entonces la evaluación de la función de entropía es -sum (p (i). * log2 [p (i)]), es popular en términos de la búsqueda de la p correspondiente (i) para cada p. * log2 [p (i ) ], a continuación, poner a todos juntos y luego tomar los resultados homólogo.
Una rutina:
Img = imread ( '1.jpg');
% para la vida del archivo de imagen '1.jpg' leen de las variables Img
% Nota aquí que si la escala de grises IMG, sólo hay un canal de color
de salida = entropía (Img)% que se calcula en una entropía de toda la imagen. El procesamiento de la imagen se ve a menudo en la imagen en un bloque, y luego encontrar la entropía para cada bloque, obtenido de esta manera es una distribución de entropía.

Nrtop función : la búsqueda de la entropía representa la fuente de entropía. Se dijo diferentes probabilidades de la muestra correspondiente a la original de codificación, si la entropía más pequeño de la probabilidad de diferentes muestras correspondientes a la mayor sea la diferencia, más muestras se puede separar correctamente la imagen en escala de grises, lo que indica más eficiente de codificación.

2, la codificación de Huffman

Uso mat2huff, huff2mat implementado Huffman la codificación y decodificación, y después de la señal codificada aplicación imratio tasa de compresión calculada.
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

Conv: Después de la codificación Huffman y descodificación de error encontrado es cero, una transmisión perfecta.

3, la preparación de los codecs de predicción sin pérdida de programa que tiene un menor p313Figure 8,7 figura entropía (5,4436) (sin pérdida de codificación predictiva).

error de predicción Display (predictionerror) FIG.
Un programa de decodificación para decodificar y verificar la correcta decodificación (comparar).
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
Aquí Insertar imagen DescripciónConv: La imagen descodificada y la imagen original se comparan, es 0 se puede obtener el error, se entiende transmisión sin pérdidas. Observados de error de predicción histograma muestra que el pico es muy alta, alrededor de 0 predicción y la redundancia espacial diferencial además de la mayoría.

4, DCT transformada discreta de más de

1) la imagen de entrada se descompone en bloques de 8 × 8.
2) de dos dimensiones transformada DCT para cada bloque.
3) la imagen en el dominio de la frecuencia.
4) parte de cada bloque de coeficientes de transformada de coseno discreta (respectivamente 64 y retención coeficientes 1,5,10,30), dejando solamente.
5) filtrar la DCT inversa de la imagen.

1, el dominio de la frecuencia de visualización de imágenes
Aquí Insertar imagen Descripción
de la figura imagen banda lateralmente estrecho visto, un cambio más lento, ancho de banda verticales descritos contienen componentes de frecuencia más altas, cambia rápidamente. Desde el punto de vista original, que se reúne

2, los coeficientes muestran

Se trata de todos los coeficientes de retención de datos
Aquí Insertar imagen Descripción

Esto es para retener un conjunto de datos de coeficiente
Aquí Insertar imagen Descripción
que es coeficientes de retención de datos 5
Aquí Insertar imagen Descripción
detrás de la aparición del resultado de procesamiento de bloque de datos se puede ver que cada bloque se sometió a la misma operación, el mismo número de coeficientes retenido

Este es un reservadas datos de 10 coeficientes
Aquí Insertar imagen Descripción
que son datos de coeficiente 30 para retener
Aquí Insertar imagen Descripción
retener los resultados de estos datos son los siguientes:
Aquí Insertar imagen Descripción
Conv: se puede ver en la figura, la imagen después de cinco recuperación de la opinión general, no hay mucha diferencia por supuesto debido al coeficiente obtenido no es el mismo, hay algunas diferencias, aunque sea pequeña, para ilustrar esta compresión será lograr una alta relación de compresión. Desde el punto de vista de los datos de coeficientes, no es difícil entender este fenómeno, los datos primero transformado 558 son los datos que más tarde se compara con 1040 es muy pequeña, por lo que su información se concentra principalmente en el primer bloque de datos la

Nota:
la transformada DCT representa la transformada de coseno discreta (Discrete Cosine Transform), es principalmente utilizado para los datos de presión o la imagen de reducción, puede ser convertido a una señales de dominio de frecuencia espaciales, una buena correlación con el rendimiento. DCT es sin pérdidas transformarse , pero a la siguiente en áreas tales como la cuantificación de imágenes de codificación, la codificación Huffman para crear un muy buen estado, al mismo tiempo, debido a la simetría DCT, por lo que podemos aprovechar el anti-DCT después de la cuantificación de codificación convertir, en el extremo receptor para restaurar la información de imagen original.
transformación DCT se ha comprimido tiene un muy amplio campo de aplicación en el análisis de la imagen actual, nuestro común JPEG fija de codificación de imágenes y MJPEG, normas de codificación MPEG dinámicos se utilizan en la transformación DCT.

En el procesamiento de imagen real, la complejidad de la transformada DCT es en realidad relativamente alta , es una práctica común, la imagen se divide en bloques, y luego la imagen transformada DCT inversa y transformada en cada bloque, y luego el bloque de mezcla, mediante el cual mejorar la eficiencia de la transformación . Procedimientos específicos de bloqueo, con los sub-bloques se hace grande, el aumento algoritmo de complejidad rápidamente, pero el uso de un bloque más grande que reducirá significativamente el efecto del bloque de imagen, por lo que hay necesidad de hacer un compromiso, en condiciones normales de uso , en su mayoría utilizando el bloque de 8 * 8.

Resultados después de 3 procesamiento DCT

Aquí Insertar imagen Descripción
Conv: sobre todo para ver la segunda figura, después de que la energía principal se puede ver en la imagen después de la conversión concentra en la esquina superior izquierda, no es difícil entender por qué el coeficiente a ser fijado de manera zigzag

datos de imagen después de transformada inversa análisis:
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripciónver además del tipo de datos, el valor de datos es consistente

[Apéndice] código de implementación

Un programa de

clear all;clc;
addpath('E:\数字图像处理\程序与图像\dipum_toolbox_2.0.2(only run)');%添加相应的.p文件 

f=imread('columbia.tif');
figure(1);
subplot(131);imshow(f);title('原图');  

e=mat2lpc(f);
subplot(132);imshow(mat2gray(e));title('去除空间冗余后图像');
f_ntrop=ntrop(f)%计算原图和编码后的熵
e_ntrop=ntrop(e) 

f_entropy=entropy(f)%计算原图和编码后的熵
e_entropy=entropy(e)  

e_imratio=imratio(f,e)%计算编码后的压缩比 g=lpc2mat(e);%解码 

subplot(133);imshow(g,[]);title('解码后图像');
compare=compare(f,g)%比较两幅图像的误差

procedimiento 2

clear all;clc;
addpath('E:\数字图像处理\程序与图像\dipum_toolbox_2.0.2(only run)');%添加相应的.p文件 
f=imread('columbia.tif');
figure(1);
subplot(121);imshow(f,[]);title('原图'); 

c=mat2huff(f);
c_imratio=imratio(f,c) 

g=huff2mat(c);
subplot(122);imshow(g,[]);title('解码后图像'); 

compare=compare(f,g)%比较两幅图像的误差

procedimiento 3

clear all;clc;
addpath('E:\数字图像处理\程序与图像\dipum_toolbox_2.0.2(only run)');%添加相应的.p文件 

f=imread('columbia.tif');

e=mat2lpc(f);%求出预测误差图像,这里其实也是获得纵向边沿的一种方式%就是把图像向右移动一个数,然后再减去原图像

figure(1);
subplot(131);imshow(f,[]);title('原图');
subplot(132);imshow(mat2gray(e));title('lpc预测误差图像');
f_entro=entropy(f)
g_entro=entropy(e)
 
%压缩编码
c=mat2huff(e);
cr=imratio(f,c) 

g=lpc2mat(huff2mat(c));
subplot(133);imshow(g,[]);title('压缩并解压后的图像');
compare=compare(f,g) 

[h,x]=hist(e(:)*512,512);
figure(2);
bar(x,h,'k');

programa de cuatro

img=imread('Fig0907(c).tif');
i1=blkproc(img,[8 8],@dct_sdu);
%此函数的主要作用是将输入的图像或者说是矩阵分快处理%第一个参数就是输入要进行处理的数据 第二个参数代表着要进行分块处理的矩阵的大小即行列,
%第三个是一个函数句柄,代表着要如何处理这个矩阵fs=fftshift(fft(img));
%这是将图像从空间域转换到频域上,然后再把低频放到图像中间位置
figure,imshow(abs(fs),[]);%显示频域图形
title('图像变换到频域');
%这是为了提取特定个数的系数来制造的mask,分别对应着取1,5,10,30 和64 个系数的时候,
%因为dct的系数是按照Zigzag的形式排列的(横斜竖斜...),我们通过制造mask与对应的系数矩阵相乘,%留下来系数的地方mask中对应的值为1,剩下的为0,即可以通过相乘的方式取得我们想要的系数
mask1=[1 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0];%取1个系数的时候对应的mask
mask2=[1 1 0 0 0 0 0 0
      1 1 0 0 0 0 0 0       
      1 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0       
      0 0 0 0 0 0 0 0];%取5个系数的时候对应的mask 
mask3=[1 1 1 1 0 0 0 0
      1 1 1 0 0 0 0 0
      1 1 0 0 0 0 0 0        
      1 0 0 0 0 0 0 0        
      0 0 0 0 0 0 0 0        
      0 0 0 0 0 0 0 0        
      0 0 0 0 0 0 0 0        
      0 0 0 0 0 0 0 0];%取10个系数的时候对应的mask 
mask4=[1 1 1 1 1 1 1 1
      1 1 1 1 1 1 1 0        
      1 1 1 1 1 1 0 0        
      1 1 1 1 0 0 0 0        
      1 1 1 1 0 0 0 0        
      1 0 0 0 0 0 0 0        
      0 0 0 0 0 0 0 0        
      0 0 0 0 0 0 0 0];%取30个系数的时候对应的mask
%将通过dct变换留下来的系数与mask相乘,其中P1代表句柄的输入值mask,x代表分快处理中的每一块

i2=blkproc(i1,[8 8],'P1.*x',mask1);
i3=blkproc(i1,[8 8],'P1.*x',mask2);
i4=blkproc(i1,[8 8],'P1.*x',mask3);
i5=blkproc(i1,[8 8],'P1.*x',mask4);
%再分块进行反变换操作
ii1=blkproc(i1,[8 8],@idct_sdu);
ii2=blkproc(i2,[8 8],@idct_sdu);
ii3=blkproc(i3,[8 8],@idct_sdu);
ii4=blkproc(i4,[8 8],@idct_sdu);
ii5=blkproc(i5,[8 8],@idct_sdu);
figure%显示结果
subplot(2,3,1),imshow(img),title('原图像');
subplot(2,3,2),imshow(ii2,[]),title('取1个dct系数');
subplot(2,3,3),imshow(ii3,[]),title('取5个dct系数');
subplot(2,3,4),imshow(ii4,[]),title('取10个dct系数');
subplot(2,3,5),imshow(ii5,[]),title('取30个dct系数');
subplot(2,3,6),imshow(ii1,[]),title('取64个dct系数'); 

img = imread('cameraman.tif');
imgdct = dct_sdu(img);  %不进行分快处理,直接进行DCT 正向变换
imgidct = idct_sdu(imgdct); %DCT 逆变换
figure (1);
subplot(131);
imshow(img); title('原始图象')
subplot(132);
%imshow(imgdct,[]); 
imshow(uint8(imgdct));%因为imgdct的值范围很大,值特别大的数很少,直接显示视觉上一片黑色
%因此用uint8,把255以上的都用白点,0以下的用黑点,这样能看清楚主要能量集中在哪儿
title('DCT 变换图象(不分块)'); 

subplot(133);
%imshow(imgidct,[]);imshow(uint8(imgidct));%显示,因为是double型的先变成uint8,再显示
title('DCT 逆变换图象'); 

子程序dct_sdu:
function Y=dct_sdu(X)       %子程序定义
[m,n] = size(X);            %得到输入图像的大小m*n
AM = zeros(m,m);            %得到m*m的零矩阵
AN = zeros(n,n);            %得到n*n的零矩阵
for i = 0:m-1               %根据DCT算法得到AM矩阵中每一元素的值
    for j = 0:m-1
        if i == 0            
            AM(i+1,j+1) = sqrt(1/m)*cos(((2*j+1)*i*pi)/(2*m));         
        else AM(i+1,j+1) = sqrt(2/m)*cos(((2*j+1)*i*pi)/(2*m));        
        end    
    end
end
for i = 0:n-1           %根据DCT算法得到AN矩阵中每一元素的值    
    for j = 0:n-1        
        if i == 0             
            AN(i+1,j+1) = sqrt(1/n)*cos(((2*j+1)*i*pi)/(2*n));         
        else AN(i+1,j+1) = sqrt(2/n)*cos(((2*j+1)*i*pi)/(2*n));         
        end
    end
end
X = double(X);       %将X转化为double形式
Y = AM*X*AN';        
%将AN矩阵和输入图像的矩阵和AN的逆矩阵相乘,得到DCT变换后结果
end 

子程序idct_sdu:
function Y=idct_sdu(X)     %同上
[m,n] = size(X);
AM = zeros(m,m);
AN = zeros(n,n);
for i = 0:m-1     
    for j = 0:m-1         
        if i == 0            
            AM(i+1,j+1) = sqrt(1/m)*cos(((2*j+1)*i*pi)/(2*m));         
        else AM(i+1,j+1) = sqrt(2/m)*cos(((2*j+1)*i*pi)/(2*m));        
        end
    end
end
for i = 0:n-1
    for j = 0:n-1
         if i == 0
             AN(i+1,j+1) = sqrt(1/n)*cos(((2*j+1)*i*pi)/(2*n));         
         else AN(i+1,j+1) = sqrt(2/n)*cos(((2*j+1)*i*pi)/(2*n));         
         end
    end
end
X = double(X);
Y = AM'*X*AN;
%将AM矩阵的逆矩阵和输入图像的矩阵和AN矩阵相乘,得到IDCT反变换后结果
end
Publicado 17 artículos originales · ganado elogios 12 · vistas 1659

Supongo que te gusta

Origin blog.csdn.net/weixin_42784535/article/details/105124468
Recomendado
Clasificación