forked from Shrediquette/PIVlab
-
Notifications
You must be signed in to change notification settings - Fork 0
/
idctn.m
90 lines (79 loc) · 2.31 KB
/
idctn.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
function [y,w] = idctn(y,w)
%IDCTN N-D inverse discrete cosine transform.
% X = IDCTN(Y) inverts the N-D DCT transform, returning the original
% array if Y was obtained using Y = DCTN(X).
%
% Class Support
% -------------
% Input array can be numeric or logical. The returned array is of class
% double.
%
% Reference
% ---------
% Narasimha M. et al, On the computation of the discrete cosine
% transform, IEEE Trans Comm, 26, 6, 1978, pp 934-936.
%
% Example
% -------
% RGB = imread('autumn.tif');
% I = rgb2gray(RGB);
% J = dctn(I);
% imshow(log(abs(J)),[]), colormap(jet), colorbar
%
% The commands below set values less than magnitude 10 in the DCT matrix
% to zero, then reconstruct the image using the inverse DCT.
%
% J(abs(J)<10) = 0;
% K = idctn(J);
% figure, imshow(I)
% figure, imshow(K,[0 255])
%
% See also DCTN, IDCT, IDCT2.
%
% -- Damien Garcia -- 2009/04, revised 2009/11
% ----------
% [Y,W] = IDCTN(X,W) uses and returns the weights which are used by the
% program. If IDCTN is required for several large arrays of same size,
% the weights can be reused to make the algorithm faster. A typical
% syntax is the following:
% w = [];
% for k = 1:10
% [y{k},w] = idctn(x{k},w);
% end
% The weights (w) are calculated during the first call of IDCTN then
% reused in the next calls.
% ----------
error(nargchk(1,2,nargin))
y = double(y);
sizy = size(y);
y = squeeze(y);
dimy = ndims(y);
if isvector(y)
dimy = 1;
y = y(:);
end
if ~exist('w','var') || isempty(w)
for dim = 1:dimy
n = (dimy==1)*numel(y) + (dimy>1)*sizy(dim);
w{dim} = exp(1i*(0:n-1)'*pi/2/n);
end
end
if ~isreal(y)
y = complex(idctn(real(y),w),idctn(imag(y),w));
else
for dim = 1:dimy
siz = size(y);
n = siz(1);
y = reshape(y,n,[]);
y = bsxfun(@times,y,w{dim});
y(1,:) = y(1,:)/sqrt(2);
y = ifft(y,[],1);
y = real(y*sqrt(2*n));
I = (1:n)*0.5+0.5;
I(2:2:end) = n-I(1:2:end-1)+1;
y = y(I,:);
y = reshape(y,siz);
y = shiftdim(y,1);
end
end
y = reshape(y,sizy);