[プロジェクト] matlab GUIDCTに基づく画像のノイズ除去[Matlabソースコード614を含む]

1.はじめに

1 DCTアルゴリズム:
DCT変換のフルネームは離散コサイン変換です。離散コサイン変換は、長さが約2倍の離散コサイン変換に相当します。この離散コサイン変換は、の実偶数関数で実行されます。デジタル信号処理の研究を通じて、実関数のフーリエ変換によって得られるスペクトルはほとんど複雑であるのに対し、偶関数のフーリエ変換の結果は実関数であることがわかります。これに基づいて、信号関数を偶関数にし、スペクトル関数の虚数部を削除することは、余弦変換の特性の1つです。強度変化の状況を知るために、光強度データのグループを周波数データに変換することができます。高周波データを変更して元のデータに戻すと、明らかに元のデータとは異なりますが、人間の目ではわかりにくいです。圧縮中、元の画像データは、明るさの値の最初のマトリックスなど、8 * 8データ単位のマトリックスに分割されます。
ここに画像の説明を挿入
ここに画像の説明を挿入

2 DCTのエンジニアリングの背景:

ビデオ信号のスペクトル線は0〜6MHzの範囲にあり、ビデオ画像に含まれるほとんどの低周波スペクトル線は、画像の非常に低い割合を占めるビデオ信号のみの高周波スペクトル線です。画像の端の領域。したがって、ビデオ信号のデジタル処理では、スペクトル係数に応じてビット数を割り当てることができます。大量の情報を含む低周波数スペクトル領域に割り当てられるビット数が多くなり、高周波数スペクトル領域に割り当てられるビット数が少なくなります。 -少量の情報を含む周波数スペクトル領域。画質に目に見える損傷はなく、ビットレート圧縮の目的が達成されます。ただし、効果的なエンコーディングを実現するには、これらすべてが低エントロピー(Entropy)値の場合である必要があります。データの文字列を効果的にエンコードできるかどうかは、各データの確率に依存します。各データの発生確率の大きな違いは、エントロピー値が低く、データの文字列を効率的にエンコードできることを示しています。逆に、発生確率の差が小さく、エントロピー値が高い場合、効率的なコーディングができません。ビデオ信号のデジタル化は、指定されたサンプリング周波数でA / Dコンバーターによってビデオレベルから変換され、各ピクセルのビデオ信号振幅は各レイヤーの時間とともに周期的に変化します。各ピクセルの平均情報の合計は、合計平均情報、つまりエントロピー値です。各ビデオレベルはほぼ等しい確率で発生するため、ビデオ信号のエントロピー値は非常に高くなります。エントロピーは、コードレートの圧縮率を定義するパラメータです。ビデオ画像の圧縮率は、ビデオ信号のエントロピー値に依存します。ほとんどの場合、ビデオ信号のエントロピー値は高くなります。効率的なエンコードのために、高いエントロピー値低い値に変更する必要があります。エントロピー。低エントロピーになる方法は?これには、ビデオ周波数スペクトルの特性を分析する必要があります。ほとんどの場合、ビデオ周波数スペクトルの振幅は、周波数が高くなるにつれて減少します。その中で、低周波スペクトルはほぼ等しい確率で0から最高レベルを取得します。これとは対照的に、高周波スペクトルは通常、低レベルとまれに高レベルになります。明らかに、低周波数スペクトルのエントロピー値は高く、高周波数スペクトルのエントロピー値は低くなっています。これにより、ビデオの低周波成分と高周波成分を別々に処理して、高周波圧縮値を取得することができます。

アーメドとラオが1974年に離散コサイン変換(DCT)の定義を与えて以来、離散コサイン変換(DCT)と修正離散コサイン変換(MDCT)は、信号処理と画像処理、特に画像で広く使用されるようになりました。重要なツールとテクノロジー圧縮および音声圧縮コーデックは、常に国際的な学界およびハイテク産業の研究のホットスポットでした。現在の多くの画像およびビデオコーディング標準(MPEG-1、MEPG-2、MEPG-4の2番目の部分など)では、整数8×8 DCTおよびIDCTの実現が必要ですが、MDCTおよびIMDCTは主にオーディオ信号コーディングで使用されます。およびデコード(MPEG-1、MEPG-2、AC-など]およびその他の標準的なオーディオコーディング部分)。このタイプの変換が広く使用されているからこそ、このタイプの変換の高速アルゴリズムの研究が特に重要です。特に、特定のアプリケーション条件下での高速アルゴリズムの研究は、システム全体のパフォーマンスを向上させるのに非常に役立ちます。
上記の引用から、レート圧縮は変換コーディングとエントロピーコーディングの2つのアルゴリズムに基づいていることがわかります。前者はエントロピー値を減らすために使用され、後者はデータをビット数を減らすことができる効果的なコーディング方法に変えます。MPEG規格では、DCTが変換コーディングに使用されます。変換プロセス自体はレート圧縮を生成しませんが、変換された周波数係数はレート圧縮に非常に役立ちます。実際、デジタルビデオ信号を圧縮するプロセス全体は、ブロックサンプリング、DCT、量子化、およびエンコードの4つの主要なプロセスに分割されます-----最初に、元の画像はN(水平)×N(垂直)サンプリングに分割されます時間領域のブロック、4×4、4×8、8×8、8×16、16×16などのブロックを選択する必要がある場合、これらのサンプリングされたピクセルブロックは、元の画像フレームの各ピクセルのグレー値を表します。 、範囲は139〜163で、DCTエンコーダーに順次送信され、サンプルブロックが時間領域から周波数領域のDCT係数ブロックに変換されます。DCTシステムの変換は、各サンプリングブロックで実行されます。これらのブロックの各サンプルは、フィールド内の対応するピクセルのビデオ信号振幅値を表すデジタル化された値です。

3離散コサイン変換の実現:

DCTを実装する方法はたくさんありますが、最も直接的な方法は、DCTの定義に従って計算することです。2次元の8xSDCTを例にとると、4096の乗算と3584の加算が必要です。このアルゴリズムの実現には膨大な量の計算が必要であり、実用的な価値はありません。アプリケーションでは、高速で正確なアルゴリズムを見つける必要があります。より一般的に使用される方法は、DCTの分離可能な機能を使用することです。2次元の8xSDCTも例として取り上げます。最初に、8行の1次元DCTには64xSの乗算と56xSの加算が必要であり、次に8列の1次元のDCTが必要です。次元DCTには64xSの乗算と56xSが必要です。2つの加算の場合、合計64x8xZ = 1024の乗算と56x8xZ = 896の加算が必要であり、計算量が大幅に削減されます。

さらに、DCTには多くのオープンで高速なアルゴリズムがあります。高速アルゴリズムは、主に操作回数を減らして操作時間を短縮することであり、高速ハードウェアシステムの設計に非常に効果的です。2次元DCTの高速アルゴリズムは、一般に、行と列の分離DCTアルゴリズムを採用します。これは、転置行列によって接続された2つの1次元変換に変換されます。最も古典的で一般的に使用されている高速アルゴリズムは、1988年にArai et al。によって提案されたAANアルゴリズムと、1989年にLoeffier etal。によって提案されたLLMアルゴリズムです。ただし、行と列で区切られたDCTアルゴリズムは、1次元の変換構造を再利用できるため、実際の実装、特にハードウェアでは、2次元の直接計算アルゴリズムよりも有利です。

第二に、ソースコード

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

3、実行中の結果

ここに画像の説明を挿入

四、備考

QQ 1564658423を追加するために、コードを完成させるか、記述してください

おすすめ

転載: blog.csdn.net/TIQCmatlab/article/details/115149263
おすすめ