一、简介
1 DCT算法:\ DCT变换的全称是离散余弦变换(Discrete Cosine Transform),离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的。通过数字信号处理的学习我们知道实函数的傅立叶变换获得的频谱大多是复数,而偶函数的傅立叶变换结果是实函数。以此为基础,使信号函数成为偶函数,去掉频谱函数的虚部,是余弦变换的特点之一。它可以将将一组光强数据转换成频率数据,以便得知强度变化的情形。若对高频的数据做些修饰,再转回原来形式的数据时,显然与原始数据有些差异,但是人类的眼睛却是不容易辨认出来。压缩时,将原始图像数据分成8*8数据单元矩阵,例如亮度值的第一个矩阵内。\ \
2 DCT产生的工程背景:
视频信号的频谱线在0-6MHz范围内,而且1幅视频图像内包含的大多数为低频频谱线,只在占图像区域比例很低的图像边缘的视频信号中才含有高频的谱线。因此,在视频信号数字处理时,可根据频谱因素分配比特数:对包含信息量大的低频谱区域分配较多的比特数,对包含信息量低的高频 谱区域分配较少的比特数,而图像质量并没有可察觉的损伤,达到码率压缩的目的。然而,这一切要在低熵(Entropy)值的情况下,才能达到有效的编码。能否对一串数据进行有效的编码,取决于每个数据出现的概率。每个数据出现的概率差别大,就表明熵值低, 可以对该串数据进行高效编码。反之,出现的概率差别小,熵值高,则不能进行高效编码。视频信号的数字化是在规定的取样频率下由A/D转换器对视频电平转换而来的,每个像素的视频信号幅度随着每层的时间而周期性地变化。每个像素的平均信息量的总和为总平均信息量,即熵值。由于每个视频电平发生几乎具有相等的概率,所以视频信号的熵值很高。 熵值是一个定义码率压缩率的参数,视频图像的压缩率依赖于视频信号的熵值,在多数情况下视频信号为高熵值,要进行高效编码,就要将高熵值变为低熵值。怎样变成低熵值呢?这就需要分析视频频谱的特点。大多数情况下,视频频谱的幅度随着频率的升高而降低。其中 低频频谱在几乎相等的概率下获得0到最高的电平。与此相对照,高频频谱通常得到的是低电平及稀少的高电平。显然,低频频谱具有较高的熵值,高频频谱具有较低的熵值。据此,可对视频的低频分量和高频分量分别处理,获得高频的压缩值。
自从Ahmed和Rao于1974年给出了离散余弦变换(DCT)的定义以来,离散余弦变换(DCT)与改进型离散余弦变换(MDCT)就成为广泛应用于信号处理和图像处理特别是用于图像压缩和语音压缩编解码的重要工具和技术,一直是国际学术界和高科技产业界的研究热点。现在的很多图像和视频编码标准(如MPEG-1 , MEPG-2 ,MEPG-4中的第二部分)都要求实现整数的8×8 的DCT和IDCT,而MDCT 和IMDCT 则主要被应用于音频信号的编解码中(如MPEG-1 ,MEPG-2 和AC-]等标准的音频编码部分)。正是由于这类变换被广泛采用,对于这类变换的快速算法的研究才显得尤为重要。特别是针对特定的应用条件下的快速算法的研究对于提高整个系统的性能表现有很大帮助。\ 由上面的引用可见,码率压缩基于变换编码和熵值编码两种算法。前者用于降低熵值,后者将数据变为可降低比特数的有效编码方式。在MPEG标准中,变换编码采用的是DCT,变换过程本身虽然并不产生码率压缩作用,但是变换后的频率系数却非常有利于码率压缩。 实际上压缩数字视频信号的整个过程分为块取样、DCT、量化、编码4个主要过程进行-----首先在时间域将原始图像分成N(水平)×N(垂直)取样块,根据需要可选择4×4、4×8、8×8、8×16、16×16等块,这些取样的像素块代表了原图像帧各像素的灰度值,其范围在139-163之间,并依序送入DCT编码器,以便将取样块由时间域转换为频率域的DCT系数块。DCT系统的转换分别在每个取样块中进行,这些块中每个取样是数字化后的值,表示一场中对应像素的视频信号幅度值
3 离散余弦变换的实现:
实现DCT的方法很多,最直接的是根据DCT的定义来计算。以二维8xSDCT为例,需要作4096次乘法和3584次加法。这种算法的实现需要巨大的计算量,不具有实用价值。在应用中,需要寻找快速而又精确的算法。较为常用的方法是利用DCT的可拆分特性,同样以二维8xSDCT为例,先进行8行一维DCT需要64xS次乘法和56xS次加法,再进行8列一维DCT要64xS次乘法和56xS次加法,共需要64x8xZ=1024次乘法和56x8xZ=896次加法,计算量大为减少。
除此之外,DCT还有很多公开的快速算法。快速算法主要是通过减少运算次数而减少运算时间,这对于设计快速的硬件系统非常有效。二维DCT的快速算法则一般采用行列分离DCT算法,即转换为两次一维变换,其间通过转置矩阵连接。最为经典和常用的快速算法是由Arai等人于1988年提出的AAN算法以及Loeffier等人于1989年提出的LLM算法。但是,由于行列分离DCT算法能够重复使用一维变换结构,因此在实际实现上,尤其在硬件上比二维直接计算算法更有优势。
二、源代码
``` function varargout = dctencoding(varargin) % DCTENCODING M-file for dctencoding.fig % DCTENCODING, by itself, creates a new DCTENCODING or raises the existing % singleton*. % % H = DCTENCODING returns the handle to a new DCTENCODING or the handle to % the existing singleton*. % % DCTENCODING('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in DCTENCODING.M with the given input arguments. % % DCTENCODING('Property','Value',...) creates a new DCTENCODING or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before dctencodingOpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to dctencoding_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 dct_encoding
% Last Modified by GUIDE v2.5 18-Jun-2009 20:11:16
% Begin initialization code - DO NOT EDIT guiSingleton = 1; guiState = struct('guiName', mfilename, ... 'guiSingleton', guiSingleton, ... 'guiOpeningFcn', @dctencodingOpeningFcn, ... 'guiOutputFcn', @dctencodingOutputFcn, ... 'guiLayoutFcn', [] , ... 'guiCallback', []); if nargin & isstr(varargin{1}) guiState.gui_Callback = str2func(varargin{1}); end
if nargout [varargout{1:nargout}] = guimainfcn(guiState, varargin{:}); else guimainfcn(guiState, varargin{:}); end % End initialization code - DO NOT EDIT
% --- Executes just before dctencoding is made visible. function dctencodingOpeningFcn(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 dctencoding (see VARARGIN) cr = 0.5; I = imread('lena.bmp'); axes(handles.axes1); imshow(I); I = double(I)/255; t = dctmtx(8); dctcoe = blkproc(I,[8 8],'P1xP2',t,t'); coevar = im2col(dctcoe,[8 8],'distinct'); coe = coevar; [y,ind] = sort(coevar); [m,n] = size(coevar); snum = 64-64cr; for i = 1:n coe(ind(1:snum),i) = 0; end B2 = col2im(coe,[8 8],[512 512],'distinct'); I2 = blkproc(B2,[8,8],'P1xP2',t',t); axes(handles.axes2); imshow(I2); e = double(I) - double(I2); [m,n]=size(e); erms = sqrt(sum(e(:).^2)/(mn)); set(handles.ermsedit,'string',erms); set(handles.credit,'string',0.5); % Choose default command line output for dct_encoding handles.output = hObject;
% Update handles structure guidata(hObject, handles);
% UIWAIT makes dct_encoding wait for user response (see UIRESUME) % uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. function varargout = dctencodingOutputFcn(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;
% --- Executes during object creation, after setting all properties. function imagepopmenuCreateFcn(hObject, eventdata, handles) % hObject handle to imagepop_menu (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end
% --- Executes on selection change in imagepopmenu. function imagepopmenuCallback(hObject, eventdata, handles) % hObject handle to imagepopmenu (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) val = get(hObject,'value'); str = get(hObject,'string'); cr = str2num(get(handles.credit,'string')); switch str{val} case 'Lena' I = imread('lena.bmp'); case 'Cameraman' I = imread('cameraman.tif'); case 'Peppers' I = imread('peppers.bmp'); case 'Fingerprint' I = imread('fingerprint.jpg'); case 'Licenceplate' I = imread('licenceplate.jpg'); case 'Cloudy' I = imread('cloudy.tif'); end [M N] = size(I); axes(handles.axes1); imshow(I); I = double(I)/255; t = dctmtx(8); dctcoe = blkproc(I,[8 8],'P1xP2',t,t'); coevar = im2col(dctcoe,[8 8],'distinct'); coe = coevar; [y,ind] = sort(coevar); [m,n] = size(coevar); snum = 64-64cr; for i = 1:n coe(ind(1:snum),i) = 0; end B2 = col2im(coe,[8 8],[M N],'distinct'); I2 = blkproc(B2,[8,8],'P1xP2',t',t); axes(handles.axes2); imshow(I2); e = double(I) - double(I2); [m,n]=size(e); erms = sqrt(sum(e(:).^2)/(mn)); set(handles.ermsedit,'string',erms); set(handles.credit,'string',0.5); % Hints: contents = get(hObject,'String') returns imagepopmenu contents as cell array % contents{get(hObject,'Value')} returns selected item from imagepopmenu
% --- Executes during object creation, after setting all properties. function creditCreateFcn(hObject, eventdata, handles) % hObject handle to cr_edit (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 set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end
function creditCallback(hObject, eventdata, handles) % hObject handle to cr_edit (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 credit as text % str2double(get(hObject,'String')) returns contents of credit as a double
% --- Executes on button press in closebutton. function closebuttonCallback(hObject, eventdata, handles) % hObject handle to closebutton (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) close(dct_encoding);
% --- Executes on button press in applybutton. function applybuttonCallback(hObject, eventdata, handles) % hObject handle to applybutton (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) cr = str2num(get(handles.cr_edit,'string')); I = getimage(handles.axes1); I = double(I)/255; t = dctmtx(8); dctcoe = blkproc(I,[8 8],'P1xP2',t,t'); coevar = im2col(dctcoe,[8 8],'distinct'); coe = coevar; [y,ind] = sort(coevar); [m,n] = size(coevar); snum = 64-floor(64*cr); for i = 1:n coe(ind(1:snum),i) = 0; end ```
三、运行结果
🎈 部分理论引用网络文献,若有侵权联系博主删除
🎁 关注我领取海量matlab电子书和数学建模资料
👇 私信完整代码和数据获取及论文数模仿真定制
1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱船配载优化、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化、CVRP问题、VRPPD问题、多中心VRP问题、多层网络的VRP问题、多中心多车型的VRP问题、 动态VRP问题、双层车辆路径规划(2E-VRP)、充电车辆路径规划(EVRP)、油电混合车辆路径规划、混合流水车间问题、 订单拆分调度问题、 公交车的调度排班优化问题、航班摆渡车辆调度问题、选址路径规划问题
2 机器学习和深度学习方面
2.1 bp时序、回归预测和分类
2.2 ENS声神经网络时序、回归预测和分类
2.3 SVM/CNN-SVM/LSSVM/RVM支持向量机系列时序、回归预测和分类
2.4 CNN/TCN卷积神经网络系列时序、回归预测和分类
2.5 ELM/KELM/RELM/DELM极限学习机系列时序、回归预测和分类
2.6 GRU/Bi-GRU/CNN-GRU/CNN-BiGRU门控神经网络时序、回归预测和分类
2.7 ELMAN递归神经网络时序、回归\预测和分类
2.8 LSTM/BiLSTM/CNN-LSTM/CNN-BiLSTM/长短记忆神经网络系列时序、回归预测和分类
2.9 RBF径向基神经网络时序、回归预测和分类