%im2jpeg源程序
function y=im2jpeg(x,quality)
%im2jpeg使用jpeg解压近似值压缩图像
%y=im2jpeg(x,quality)在8*8块DCT转换、系数量化和霍夫曼符号编码下寓所图像x
%输入quality决定的是已给丢失和压缩的信息数量。
%y是编码结构域:
%Y.size x的类型
%Y.numblock 8*8编码块的数量
%Y.quality 质量因素(百分比)
%Y.huffman 由mat2huff返回霍曼夫编码结构
%也看jpeg2im
error(nargchk(1,2,nargin));%检查输入参数
if ndims(x)~=2 | ~isreal(x) | ~isnumeric(x) | ~isa(x,'uint8')
error('The input must be a UINT8 image.');
end
if nargin<2
quality=1;%设置默认值
end
m=[16 11 10 16 24 40 51 61%jpeg标准化数组和重排列的zig-zag模型
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 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99]*quality;
order=[1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 ...
41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 ...
43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 ...
62 63 56 64];
[xm,xn]=size(x);%得到输出大小
x=double(x)-128;%水平平移输入
t=dctmtx(8);%计算8*8DCT矩阵
%计算8*8块DCT和量化系数
y=blkproc(x,[8 8],'P1*x*P2',t,t');
y=blkproc(y,[8 8],'round(x./P1)',m);
y=im2col(y,[8 8],'distinct');%打破8*8块进入列
xb=size(y,2);%得到块数
y=y(order,:);%重排列列元素
eob=max(x(:))+1;%创造最后的块符号
r=zeros(numel(y)+size(y,2),1);
count=0;
for j=1:xb%每次处理1个块(列)
i=max(find(y(:,j)));%找到最后一个非零元素
if isempty(i)%没有非零块元素
i=0;
end
p=count+1;
q=p+i;
r(p:q)=[y(1:i,j);eob];%截断结尾为0,加eob到输出变量
count=count+i+1;
end
r((count+1):end)=[];%删除未使用过的r的部分
y.size=uint16([xm xn]);
y.numblocks=uint16(xb);
y.quality=uint16(quality*100);
y.huffman=mat2huff(r);
im2jpeg.m
最新推荐文章于 2020-07-13 21:17:42 发布