using discrete cosine transform to break 16x16 to 8x8 blocks

2 views (last 30 days)
I have to break a image-pixel array down to 8x8 blocks. Here is my code
function imcompress(fig,fmt,mask)
p = imread(fig,fmt);
p = im2double(p);
siz = size(p)-rem(size(p),8);
for c = 1:3
i = j(1:siz(1),1:siz(2),c)
end
Q = dctmtx(8)
fund = @(R) Q*R*Q'
B = blockproc(i, [8 8],fund);
B = blockproc(B, [8 8],@(block) mask.*block.data);
fundid = @(R) Q'*R*Q
I2 = blockproc(B, [8 8],fundid)
I2 = p2(1:siz(1),1:siz(2),c)
imshow(i), figure, imshow(I2)
And I also got my mask function
function mask = mymask(n)
mask=zeros(8);
matr= fliplr(triu(ones(n)));
mask(1:n,1:n)=matr;
end
When I test the picture,which called picture.jpg, I typed imcompress('picture','jpg',mymask(8)) it said Error in imcompress (line 6) ,i = j(1:size(1),1:size(2),c) I am not sure what's wrong with my code. Can someone help me up, and point out some others error codes?
  3 Comments
jarvan
jarvan on 13 Dec 2014
there are a new size, which is siz = size(p)-rem(size(p),8); i have use the new size to break down to 8x8 blocks. I know the low-frequency of the picture is left-up corner, like
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
jarvan
jarvan on 13 Dec 2014
i am using a for-loop to trim the input array down to the nearest multiple of 8

Sign in to comment.

Accepted Answer

Geoff Hayes
Geoff Hayes on 14 Dec 2014
Jarvan - you mention that the error message is
Error in imcompress (line 6) ,i = j(1:size(1),1:size(2),c)
but you haven't included all of the error message...but it seems clear what the error is. You have not defined j nor is it an input parameter. You haven't described what you intend to do with this for loop and so you need to clear up the following problems with it
  1. What is j?
  2. Why is the code calculating size(1) and size(2), or should this be siz(1) and siz(2) instead? And if so, you may want to consider renaming this siz variable.
  3. What is the purpose of i?
  5 Comments
Geoff Hayes
Geoff Hayes on 16 Dec 2014
Unfortuantely, I don't have the Image Processing Toolbox, so can't run your code. You need to solve this problem by stepping through it with the debugger so that you can see where the errors are and convince yourself that each line of code is necessary and is doing what you intend. For example, what is p2 that is referenced at the line
I2 = p2(1:siz(1),1:siz(2),c)
And note how you reference i at the next to last line even though this local variable no longer exists.
To save the result of each RGB channel, just do something like the following prior to entering the for loop
outImg = [];
for c = 1:3
% do stuff from above
% save I2 to outing
outImg(:,:,c) = I2;
end
imshow(p);
figure;
imshow(outImg);
And see also Image Analyst's answer as that will point you in the right direction.

Sign in to comment.

More Answers (1)

Image Analyst
Image Analyst on 15 Dec 2014

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!