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

2 Ansichten (letzte 30 Tage)
jarvan
jarvan am 10 Dez. 2014
Kommentiert: jarvan am 16 Dez. 2014
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 Kommentare
jarvan
jarvan am 13 Dez. 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 am 13 Dez. 2014
i am using a for-loop to trim the input array down to the nearest multiple of 8

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Geoff Hayes
Geoff Hayes am 14 Dez. 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 Kommentare
Geoff Hayes
Geoff Hayes am 16 Dez. 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.
jarvan
jarvan am 16 Dez. 2014
thank you let me try it again

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Image Analyst
Image Analyst am 15 Dez. 2014

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by