我想用MATLAB实现JPEG压缩。在计算符号概率(霍夫曼编码)的点处,我可以看到一些负值。我确信这不正确!如果有人可以提供一些帮助或指示,我会非常感激。提前感谢大家。我使用MATLAB R2012b。这是代码:
clc;
clear all;
a = imread('test.png');
b = rgb2gray(a);
b = imresize(b, [256 256]);
b = double(b);
final = zeros(256, 256);
mask = [1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 0
1 1 1 1 1 0 0 0
1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0];
qv1 = [ 16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99];
t = dctmtx(8);
DCT2D = @(block_struct) t*block_struct.data*t';
msk = @(block_struct) mask.*block_struct.data;
for row = 1:8:256
for column = 1:8:256
x = (b(row:row+7, column:column+7));
xf = blockproc(x, [8 8], DCT2D);
xf1 = blockproc(xf, [8 8], msk);
xf1 = round(xf1./qv1).*qv1;
final(row:row+7, column:column+7) = xf1;
end
end
[symbols,p] = hist(final,unique(final));
bar(p, symbols);
p = p/sum(p); %NEGATIVE VALUES????
答案 0 :(得分:0)
我认为您可能会交换hist
(symbols
和p
)的输出。概率应根据箱数计算,这是hist
的第一个输出。
[nelements,centers] = hist(data,xvalues)
返回一个额外的行向量centers
,指示每个bin中心在x轴上的位置。要绘制直方图,您可以使用bar(centers,nelements)
。
换句话说,而不是你当前的行,
[symbols,p] = hist(final,unique(final));
只需使用,
[p,symbols] = hist(final,unique(final));
此外,final
是一个矩阵而不是一个向量,因此nelements
将是一个矩阵:
如果
data
是矩阵,则为每列单独创建直方图。每个直方图都以不同的颜色显示在同一个图上。