⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deblock.m

📁 jpeg的matlab代码
💻 M
字号:
% deblock - smooth blocking artifacts%% SYNOPSIS%	deblock(X)%	deblock(X, ...)%% DESCRIPTION% 	deblock performs a smoothing procedure in an effort to reduce% 	blocking artifacts (the telltale discontinuities between blocks%	which often follow aggressive quantizing). For a given block, a%	polynomial is fitted using the DC coefficients from nearest %	neighbors. The k (default 5) lowest-frequency zero AC coefficients %	are replaced by values from the polynomial. Replaced values are %	clamped so that (in magnitude) they do not exceed values which %	would not have quantized to zero.  If the quantizer Q is not %	given, then the global QMAT is used.%%	The procedure is applied after dequantizing the quantized%	transformed image (e.g., X = dequant(quant(dct(image), Q)) ).%	The basic procedure is described in Pennebaker and Mitchell.%% BUGS%	It's slow.% Copyright (C) 1995-1997 Darrel Hankerson and Greg A. Harris%% This file is part of the JPEGtool collection of scripts for Octave% and Matlab; see http://www.dms.auburn.edu/compression%% The JPEGtool collection is free software; you can redistribute it% and/or modify it under the terms of the GNU General Public License% as published by the Free Software Foundation; either version 2, or% (at your option) any later version.%% The collection is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the% GNU General Public License for more details.%% You should have received a copy of the GNU General Public License% along with this package; see the file COPYING.  If not, write to the% Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA% 02111-1307, USA.function X = deblock(X, arg2, arg3)global QMATif exist('arg2')  if (length(arg2) > 1) Q = arg2; else k = arg2; end  if exist('arg3')    if (length(arg3) > 1) Q = arg3; else k = arg3; end  endend    if ~exist('Q')  Q = QMAT;end% The number of entries to smooth can be specified (default is k=5).if ~exist('k')  k = 5;endN = size(Q, 1);% Let %   p(v,u) = A1 u^2 v^2 + A2 u^2 v + A3 u v^2 + A4 u^2 + A5 u v%            + A6 y^2 + A7 u + A8 v + A9% be a surface over a 3x3 grid (where each element is an NxN block).% Choose the coefficients A1--A9 so that the average value of p over each % element is the corresponding DC coefficient.%% Write in matrix form%   MA = D% and then find the matrix inverse of M (since we must solve for many D).% Using an LU decomposition (rather than the inverse of M) may be preferable.M = zeros(9);for v = 1:9  y = floor((v-1)/3)*N + 1; y = y:y+N-1;  x = rem(v-1, 3)*N + 1; x = x:x+N-1;  x1 = x * ones(N,1); y1 = y * ones(N,1);  x2 = x * x'; y2 = y * y';  M(v,:) = [x2*y2 x2*y1 x1*y2 N*x2 x1*y1 N*y2 N*x1 N*y1 N*N];endM = inv(M) * N;% Given D, we need the surface over the center block in the 3x3 grid.% The matrices U and V are used in the calculation.u = [N+1:N+N];u = [u.*u; u; ones(1,N)];V = u([1 2 1 3 2 1 3 2 3], :)' ;U = u([1 1 2 1 2 3 2 3 3], :);z = zigzag(N);dim=size(X)/N; m=dim(1); n=dim(2);% Extract the DC coefficients from X.DC = X(1:N:m*N, 1:N:n*N);for v = 1:m-2  vv = v*N;  for u = 1:n-2    % Find the coefficients A1--A9.    A = M * reshape(DC(v:v+2, u:u+2)', 9, 1);    % Find the surface over the center block of the current 3x3 grid.    S = dct(V * ( U .* A(:, ones(1, N)) ), N);    % Now smooth.    uu = u*N;    for j = 2:k+1      y = z(j,1); x = z(j,2);      if X(vv+y, uu+x) == 0        % this is a candidate for smoothing	a = S(y,x);                % predicted value	if abs(a) > Q(y,x)/2       % clamp	  a =  sign(a) * Q(y,x)/2;	end	X(vv+y, uu+x) = a;      end    end  endend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -