im2jpeg.m

%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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值