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

2 次查看(过去 30 天)
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 个评论
jarvan
jarvan 2014-12-13
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 2014-12-13
i am using a for-loop to trim the input array down to the nearest multiple of 8

请先登录,再进行评论。

采纳的回答

Geoff Hayes
Geoff Hayes 2014-12-14
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 个评论
Geoff Hayes
Geoff Hayes 2014-12-16
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.

请先登录,再进行评论。

更多回答(1 个)

Image Analyst
Image Analyst 2014-12-15

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by