[Proyecto] Eliminación de ruido de imágenes basada en la GUI DCT de matlab [Contiene el código fuente 614 de Matlab]

1. Introducción

1 Algoritmo DCT:
El nombre completo de la transformada DCT es Transformada de coseno discreta. La Transformada de coseno discreta es equivalente a una Transformada de Fourier discreta cuya longitud es aproximadamente el doble. Esta Transformada de Fourier discreta se realiza en una función par real. De. Mediante el estudio del procesamiento de señales digitales, sabemos que el espectro obtenido por la transformada de Fourier de una función real es mayoritariamente complejo, mientras que el resultado de la transformada de Fourier de una función par es una función real. Sobre esta base, hacer que la función de señal sea una función uniforme y eliminar la parte imaginaria de la función espectral es una de las características de la transformada de coseno. Puede convertir un grupo de datos de intensidad de luz en datos de frecuencia para conocer la situación de los cambios de intensidad. Si modifica los datos de alta frecuencia y luego vuelve a los datos originales, obviamente es diferente de los datos originales, pero no es fácil de reconocer por los ojos humanos. Durante la compresión, los datos de la imagen original se dividen en una matriz de 8 * 8 unidades de datos, como la primera matriz de valores de brillo.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

2 Formación en ingeniería de DCT:

La línea de espectro de la señal de video está en el rango de 0-6MHz, y la mayoría de las líneas de espectro de baja frecuencia contenidas en una imagen de video son líneas de espectro de alta frecuencia solo en la señal de video que ocupa una proporción muy baja de la imagen. área en el borde de la imagen. Por lo tanto, en el procesamiento digital de señales de video, el número de bits se puede asignar de acuerdo con los factores espectrales: se asignan más bits al área del espectro de baja frecuencia que contiene una gran cantidad de información, y se asignan menos bits al área de alta frecuencia. -Área del espectro de frecuencia que contiene la baja cantidad de información No hay daños perceptibles en la calidad de la imagen y se logra el propósito de la compresión de la tasa de bits. Sin embargo, todos estos deben estar en el caso de un valor de entropía baja (entropía) para lograr una codificación eficaz. El hecho de que una cadena de datos se pueda codificar de forma eficaz depende de la probabilidad de cada dato. La gran diferencia en la probabilidad de ocurrencia de cada dato indica que el valor de entropía es bajo y la cadena de datos se puede codificar de manera eficiente. Por el contrario, si la diferencia en la probabilidad de ocurrencia es pequeña y el valor de entropía es alto, no se puede realizar una codificación eficiente. La digitalización de la señal de video se convierte desde el nivel de video por el convertidor A / D a la frecuencia de muestreo especificada, y la amplitud de la señal de video de cada píxel cambia periódicamente con el tiempo de cada capa. La suma de la información promedio de cada píxel es la información promedio total, es decir, el valor de entropía. Dado que cada nivel de video ocurre con casi la misma probabilidad, el valor de entropía de la señal de video es muy alto. La entropía es un parámetro que define la tasa de compresión de la tasa de código. La tasa de compresión de una imagen de video depende del valor de entropía de la señal de video. En la mayoría de los casos, la señal de video tiene un valor de entropía alto. Para una codificación eficiente, el valor de entropía alto debe cambiarse a un valor bajo Entropía. ¿Cómo llegar a ser de baja entropía? Esto requiere analizar las características del espectro de frecuencias de video. En la mayoría de los casos, la amplitud del espectro de frecuencia de video disminuye a medida que aumenta la frecuencia. Entre ellos, el espectro de baja frecuencia obtiene 0 al nivel más alto con casi la misma probabilidad. En contraste con esto, el espectro de alta frecuencia suele tener un nivel bajo y un nivel alto poco común. Obviamente, el espectro de baja frecuencia tiene un valor de entropía más alto y el espectro de alta frecuencia tiene un valor de entropía más bajo. De acuerdo con esto, los componentes de baja frecuencia y los componentes de alta frecuencia del video se pueden procesar por separado para obtener valores de compresión de alta frecuencia.

Desde que Ahmed y Rao dieron la definición de Transformada de coseno discreta (DCT) en 1974, la Transformada de coseno discreta (DCT) y la Transformada de coseno discreta modificada (TCMD) se han utilizado ampliamente en el procesamiento de señales y procesamiento de imágenes, especialmente para imágenes. Herramientas y tecnologías importantes para la compresión y el códec de compresión de voz siempre han sido puntos de acceso de investigación en la academia internacional y las industrias de alta tecnología. Muchos estándares actuales de codificación de imágenes y video (como MPEG-1, MEPG-2 y la segunda parte de MEPG-4) requieren la realización de DCT e IDCT enteros 8 × 8, mientras que MDCT e IMDCT se utilizan principalmente en la codificación de señales de audio y decodificación (como MPEG-1, MEPG-2 y AC-] y otras partes de codificación de audio estándar). Precisamente porque este tipo de transformación es muy utilizado, la investigación sobre algoritmos rápidos de este tipo de transformación es especialmente importante. En particular, el estudio de algoritmos rápidos en condiciones de aplicación específicas es de gran ayuda para mejorar el rendimiento de todo el sistema.
Puede verse en la cita anterior que la tasa de compresión se basa en dos algoritmos: codificación de transformación y codificación de entropía. El primero se utiliza para reducir el valor de entropía y el segundo convierte los datos en un método de codificación eficaz que puede reducir el número de bits. En el estándar MPEG, DCT se utiliza para la codificación de transformada Aunque el proceso de transformación en sí mismo no produce compresión de velocidad, los coeficientes de frecuencia transformados son muy propicios para la compresión de velocidad. De hecho, todo el proceso de compresión de señales de video digital se divide en cuatro procesos principales: muestreo de bloques, DCT, cuantificación y codificación ----- En primer lugar, la imagen original se divide en muestreo N (horizontal) × N (vertical) bloques en el dominio del tiempo, de acuerdo con la necesidad de elegir 4 × 4, 4 × 8, 8 × 8, 8 × 16, 16 × 16 y otros bloques, estos bloques de píxeles muestreados representan el valor gris de cada píxel del marco de la imagen original , y el rango está entre 139-163, y se envía secuencialmente al codificador DCT para convertir el bloque de muestra del dominio del tiempo al bloque del coeficiente DCT del dominio de la frecuencia. La conversión del sistema DCT se realiza en cada bloque de muestreo, cada muestra de estos bloques es un valor digitalizado, que representa el valor de amplitud de la señal de video del píxel correspondiente en un campo.

3 Realización de la transformada discreta del coseno:

Hay muchas formas de implementar DCT, la más directa es calcular de acuerdo con la definición de DCT. Tomando 8xSDCT bidimensional como ejemplo, se requieren 4096 multiplicaciones y 3584 sumas. La realización de este algoritmo requiere una gran cantidad de cálculos y no tiene valor práctico. En la aplicación, es necesario encontrar un algoritmo rápido y preciso. El método más comúnmente usado es usar la característica separable de DCT. También tome el 8xSDCT bidimensional como ejemplo. Primero, el DCT unidimensional de 8 filas requiere multiplicaciones de 64xS y adiciones de 56xS, y luego el de 8 columnas de una sola dimensión. DCT dimensional requiere multiplicaciones de 64xS y 56xS. Para dos sumas, se requiere un total de 64x8xZ = 1024 multiplicaciones y 56x8xZ = 896 sumas, lo que reduce en gran medida la cantidad de cálculo.

Además, DCT tiene muchos algoritmos abiertos y rápidos. El algoritmo rápido es principalmente para reducir el tiempo de operación al reducir el número de operaciones, lo cual es muy efectivo para diseñar sistemas de hardware rápidos. El algoritmo rápido de DCT bidimensional generalmente adopta el algoritmo DCT de separación fila-columna, que se convierte en dos transformaciones unidimensionales, que están conectadas por una matriz transpuesta. Los algoritmos rápidos más clásicos y comúnmente utilizados son el algoritmo AAN propuesto por Arai et al. En 1988 y el algoritmo LLM propuesto por Loeffier et al. En 1989. Sin embargo, dado que el algoritmo DCT separado por filas y columnas puede reutilizar la estructura de transformación unidimensional, es más ventajoso que el algoritmo de cálculo directo bidimensional en la implementación real, especialmente en hardware.

En segundo lugar, el código fuente

function varargout = imDCT(varargin)
% IMDCT M-file for imDCT.fig
%      IMDCT, by itself, creates a new IMDCT or raises the existing
%      singleton*.
%
%      H = IMDCT returns the handle to a new IMDCT or the handle to
%      the existing singleton*.
%
%      IMDCT('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in IMDCT.M with the given input arguments.
%
%      IMDCT('Property','Value',...) creates a new IMDCT or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before imDCT_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to imDCT_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help imDCT

% Last Modified by GUIDE v2.5 07-Dec-2009 19:54:09

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @imDCT_OpeningFcn, ...
                   'gui_OutputFcn',  @imDCT_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{
    
    1})
    gui_State.gui_Callback = str2func(varargin{
    
    1});
end

if nargout
    [varargout{
    
    1:nargout}] = gui_mainfcn(gui_State, varargin{
    
    :});
else
    gui_mainfcn(gui_State, varargin{
    
    :});
end
% End initialization code - DO NOT EDIT


% --- Executes just before imDCT is made visible.
function imDCT_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to imDCT (see VARARGIN)

% Choose default command line output for imDCT
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes imDCT wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = imDCT_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{
    
    1} = handles.output;



function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double


% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit2_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a double


% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
ImgPath=get(handles.edit1,'String');
CompressRate=uint8(fix(str2num(get(handles.edit2,'String'))));
if CompressRate>64
    CompressRate=64;
end
if CompressRate<1
    CompressRate=1;
end
set(handles.edit2,'String',num2str(CompressRate));
img=imread(ImgPath);
axes(handles.axes1);
imshow(img);
set(handles.text7,'Visible','off');
set(handles.text7,'String','处理状态:正在处理中...');
set(handles.text7,'Visible','on');
pause(0.1);
Block=ceil(size(img)/8);
ImgDCT=zeros(Block*8);
ImgRestoreTemp=zeros(Block*8);
ImgRestore=zeros(size(img));
ImgBlock=zeros(8);
DCTBlock=zeros(8);
vector=zeros(1,64);
for ii=1:Block(1)
    for jj=1:Block(2)
        ImgBlock(:,:)=zeros(8);
        if ii==Block(1)
            if jj==Block(2)
                ImgBlock(1:size(img,1)-(ii-1)*8,1:size(img,2)-(jj-1)*8)=img((ii-1)*8+1:size(img,1),(jj-1)*8+1:size(img,2));
            else
                ImgBlock(1:size(img,1)-(ii-1)*8,:)=img((ii-1)*8+1:size(img,1),(jj-1)*8+1:jj*8);
            end
        else
            if jj==Block(2)
                ImgBlock(:,1:size(img,2)-(jj-1)*8)=img((ii-1)*8+1:ii*8,(jj-1)*8+1:size(img,2));
            else
                ImgBlock(:,:)=img((ii-1)*8+1:ii*8,(jj-1)*8+1:jj*8);
            end
        end
        DCTBlock(:,:)=dct2(ImgBlock(:,:));
        if CompressRate~=64
            vector(1:64)=m2v(DCTBlock(:,:));
            vector(CompressRate+1:64)=0;
            DCTBlock(:,:)=v2m(vector(1:64));
        end
        ImgDCT((ii-1)*8+1:ii*8,(jj-1)*8+1:jj*8)=DCTBlock(:,:);
    end
end

Tres, resultados en ejecución

Inserte la descripción de la imagen aquí

Cuatro, comentarios

Complete el código o escriba en nombre de agregar QQ 1564658423

Supongo que te gusta

Origin blog.csdn.net/TIQCmatlab/article/details/115149263
Recomendado
Clasificación