Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
回复
 
主题工具 显示模式
旧 2010-01-09, 12:19   #1
qinguan
初级会员
 
注册日期: 2010-01-09
帖子: 1
声望力: 0
qinguan 正向着好的方向发展
默认 关于DCT图像压缩中的编码问题

DCT图像压缩一般分几部分:分块、DCT变换、量化、编码、解码、DCT逆变换、合成。
我自己编了个图像压缩程序,但其中的解码部分出现了数组越界问题,很纳闷。。

我开始测试encode和dcede函数的时候是正确的,也就是编码解码后是可以还原到原来的矩阵的。
但当我输入一幅RGB图像时,才出现问题。

报错语句:x(s,r)=data(t);
主要是x的范围大于了data的范围,导致越界。但本来应该是x和data的大小是一样的。
结果data变小了,不知什么原因。。。

编码部分采用了游程编码算法。。。
就是把一个二维矩阵先转换成一维序列,再对一维序列进行编码。
解码部分是根据图像大小,申请一个空间,然后再根据编码提供的(值,数目)序列,先还原成一维序列,再还原成二维矩阵。

求高人解答。谢谢。
代码:
%编码
%x为一维序列
%若y为二维矩阵,则x=y(:)
function [value,num]=encode(x)
j=1;
num(1)=1;
for z=1:1:(length(x)-1)
    if x(z)==x(z+1)
        num(j)=num(j)+1;
    else
        value(j)=x(z);
        j=j+1;
        num(j)=1;
    end
end
value(j)=x(length(x));
%=========================================================
%解码
%m\n为原矩阵大小
%value\num为编码后的两个值
function x=dcode(m,n,value,num)
x=zeros(m,n);
k=1;
[value1,value2]=size(value);
%还原成一维序列
for i=1:1:value2
    for j=1:1:num(i)
        data(k)=value(1,i);
        k=k+1;
    end
end
disp('data:');
disp(size(data));
%还原矩阵
t=1;
for r=1:1:n
    for s=1:1:m
        x(s,r)=data(t);
        t=t+1;
    end
end
%=====================================================
%主函数
%下面是对彩色图像的DCT变换处理
clear;
close all;
%读取图像
RGB =imread('D:\Program Files\MATLAB\pics\8.jpg');
%将RGB转换为灰度图像
GRAY = rgb2gray(RGB);
%掩模
mask = [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
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0];
%RGB图分层处理,得到三个分量图
R1 = RGB(:,:,1);
G1 = RGB(:,:,2);
B1 = RGB(:,:,3);

%转化为双精度
IR = im2double(R1);
IG = im2double(G1);
IB = im2double(B1);
%三个分量图像处理
%分别对图像进行分块,DCT变换,
RR = blkproc(IR,[8 8],'dct2');
GG = blkproc(IG,[8 8],'dct2');
BB = blkproc(IB,[8 8],'dct2');
%保留部分DCT系数
RR2 = blkproc(RR,[8 8],'P1.*x',mask);
GG2 = blkproc(GG,[8 8],'P1.*x',mask);
BB2 = blkproc(BB,[8 8],'P1.*x',mask);
%编码
[value_R,num_R]=encode(RR2(:));
[value_G,num_G]=encode(GG2(:));
[value_B,num_B]=encode(BB2(:));
%取得大小参数
[p_R,q_R]=size(RR2);
[p_G,q_G]=size(GG2);
[p_B,q_B]=size(BB2);
%解码
RR2=dcode(p_R,q_R,value_R,num_G);
GG2=dcode(p_G,q_G,value_G,num_G);
BB2=dcode(p_B,q_B,value_B,num_B);
%DCT逆变换操作
R2 = blkproc(RR2,[8 8],'idct2');
G2 = blkproc(GG2,[8 8],'idct2');
B2 = blkproc(BB2,[8 8],'idct2');
%将三个分量图像整合,RGB2即为重构后的真彩图
RGB2(:,:,1)=R2;
RGB2(:,:,2)=G2;
RGB2(:,:,3)=B2;
figure('Name','原始真彩图'),imshow(RGB);
figure('Name','分层处理进行DCT变换整合后的效果'),imshow(RGB2);
qinguan 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码



所有时间均为北京时间。现在的时间是 22:24


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.