-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCompression.m
59 lines (51 loc) · 1.87 KB
/
Compression.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
function [cImage, sB, sA] = Compression(image,percent)
%COMPRESSION Compresses 2D mat by the percent. Require 2^k.
% Eliminates least significant "percent" of haar coefficients.
% Parts of the code copied over from HW#4.
[H,W,~] = size(image);
% rectSide = ceil(min([H,W]) / 32);
% rectSize = [rectSide,rectSide];
rectSize = [8,8];
sB = 0;
sA = 0;
raw = cast(image,'int16');
for i = 1:rectSize(1):H
for j = 1:rectSize(2):W
haarImg = raw(i:(i+(rectSize(1) - 1)),j:(j+(rectSize(2) - 1)));
for x = 1:rectSize(2)
haarImg(:,x) = HaarTf(haarImg(:,x));
end
for y = 1:rectSize(1)
haarImg(y,:) = HaarTf(haarImg(y,:));
end
sB = sB + nnz(haarImg); %Before compression
values = sort(abs(nonzeros(haarImg)));
s = size(values);
if max(s) > 1 && min(s) > 0 %added later && min(s) > 0
numToDelete = min(s(1,1),ceil(percent * max(size(values))));
epsilon = values(numToDelete,1);
if values(numToDelete,1) < values(s(1,1),1)
haarImg((-epsilon) <= haarImg & haarImg <= epsilon) = 0;
else
epsilon = values(numToDelete,1);
haarImg((-epsilon) < haarImg & haarImg < epsilon) = 0;
end
end
sA = sA + nnz(haarImg); %After compression
raw(i:(i+(rectSize(1) - 1)),j:(j+(rectSize(2) - 1))) = haarImg;
end
end
for i = 1:rectSize(1):H
for j = 1:rectSize(2):W
filteredMat = raw(i:(i+(rectSize(1) - 1)),j:(j+(rectSize(2) - 1)));
for y = 1:rectSize(1)
filteredMat(y,:) = InvHaarTf(filteredMat(y,:));
end
for x = 1:rectSize(2)
filteredMat(:,x) = InvHaarTf(filteredMat(:,x));
end
raw(i:(i+(rectSize(1) - 1)),j:(j+(rectSize(2) - 1))) = filteredMat;
end
end
cImage = cast(raw, 'uint8');
end