如何在MATLAB-图像压缩中存储数据

时间:2013-10-02 14:14:52

标签: matlab image-processing image-compression

这是基本的,但我不知道该怎么做..我想在图像中采用8x8窗口,并进一步将该窗口细分为2x2,然后必须找到它们的平均值。在这之后,我必须将该平均值矩阵与阈值平均值(整个图像的平均值或该8x8窗口的平均值)进行比较。如果元素大于或等于阈值,则应该为其分配1(如果不是0)(将其转换为二进制图像)。在所有操作之后,256x256图像将变为128x128。压缩将实现。为此,我在下面的代码中写了这个。

完成所有操作后,我不知道如何在每次循环后存储结果(在与阈值比较之后)。我需要这样做来构建压缩图像。请帮忙。我的代码需要一段时间才能运行。我认为这可以更简单地编码。请解释我如何在图像中滑动窗口并存储如何存储处理后的值以构建输出图像..所以我可以清楚地理解..Pls提供任何材料来学习图像处理基础知识,如滑动窗口和MATLAB中的其他内容

我的代码在这里:

%在此代码中,仅存储最终窗口值。不存储先前窗口的值。我需要存储所有窗口的值以获取压缩图像。帮助我。

I=imread('C:\Users\Prem\Documents\MATLAB\mandrill.jpg');
G=rgb2gray(I);
J=imresize(G,[256 256]);
thr=mean(J(:));
[m,n]=size(J); % Reading the size of the image
for i=1:m 
    for j=1:n

      P=J(i:(i+7),j:(j+7)); % Reading 8x8 window

        % Sub dividing the 8 x 8 window into four 4x4 sub windows 

    tl = P(1:4, 1:4); % top left sub-window
    tr = P(1:4, 5:8); % top right sub-window
    bl = P(5:8, 1:4); % bottom left sub-window
    br = P(5:8, 5:8); % bottom right sub-window

     % Sub dividing the 4 x 4 window into four 2x2 sub windows 

    newtl_1 = tl(1:2, 1:2); % top left sub-window
    newtr_1 = tl(1:2, 3:4); % top right sub-window
    newbl_1 = tl(3:4, 1:2); % bottom left sub-window
    newbr_1 = tl(3:4, 3:4); % bottom right sub-window

     % Sub dividing the 4 x 4 window into four 2x2 sub windows 

    newtl_2 = tr(1:2, 1:2); % top left sub-window
    newtr_2 = tr(1:2, 3:4); % top right sub-window
    newbl_2 = tr(3:4, 1:2); % bottom left sub-window
    newbr_2 = tr(3:4, 3:4); % bottom right sub-window

     % Sub dividing the 4 x 4 window into four 2x2 sub windows 

    newtl_3 = bl(1:2, 1:2); % top left sub-window
    newtr_3 = bl(1:2, 3:4); % top right sub-window
    newbl_3 = bl(3:4, 1:2); % bottom left sub-window
    newbr_3 = bl(3:4, 3:4); % bottom right sub-window

     % Sub dividing the 4 x 4 window into four 2x2 sub windows 

    newtl_4 = br(1:2, 1:2); % top left sub-window
    newtr_4 = br(1:2, 3:4); % top right sub-window
    newbl_4 = br(3:4, 1:2); % bottom left sub-window
    newbr_4 = br(3:4, 3:4); % bottom right sub-window

      % mean values of the four sub windows

        m1=mean(newtl_1(:));
        m2=mean(newtr_1(:));
        m3=mean(newbl_1(:));
        m4=mean(newbr_1(:));

         % mean values of the four sub windows

        m5=mean(newtl_2(:));
        m6=mean(newtr_2(:));
        m7=mean(newbl_2(:));
        m8=mean(newbr_2(:));

         % mean values of the four sub windows

        m9=mean(newtl_3(:));
        m10=mean(newtr_3(:));
        m11=mean(newbl_3(:));
        m12=mean(newbr_3(:));

        % mean values of the four sub windows

        m13=mean(newtl_4(:));
        m14=mean(newtr_4(:));
        m15=mean(newbl_4(:));
        m16=mean(newbr_4(:));

     M=[m1 m2 m3 m4; m5 m6 m7 m8; m9 m10 m11 m12; m13 m14 m15 m16];

OutputCompressedImage=M>thr;

    end
end
    imshow(OutputCompressedImage)

%在此代码中,仅存储最终窗口值。不存储先前窗口的值。我需要存储所有窗口的值以获取压缩图像。帮助我。

1 个答案:

答案 0 :(得分:0)

每次循环迭代都会覆盖OutputCompressedImage,这就是为什么你只得到最终的窗口值。 一种方法是使用三维数组来保存数据,每个切片代表一个窗口。

你的循环可以通过以下方式修改:

s=1;
for i=1:m 
    for j=1:n
      ****keep original code****
      OutputCompressedImage(:,:,s)=M>thr;
      s=s+1;
    end
end

OutputCompressedImage的维度有m * n个切片。

P.S。移动窗口可以考虑使用卷积。 http://www.mathworks.com/help/matlab/ref/conv2.html