Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

i've an image of size 185x256 and i've divided the image into discrete blocks having block rows 16 and block columns 16. when i access the blocks in a loop it says index exceeds matrix dimension...

Asked by pammy on 10 Apr 2013

the code is as follows:

in the following image it has 11 rows and 16 columns grayImage http://imageshack.us/photo/my-images/17/tanklb.jpg/

 grayImage=rgb2gray(Imread('tank.jpg'));
 whos grayImage
 [rows columns numberOfBands]=size(grayImage);
 blockSizeR = 16;% Rows in block.
 blockSizeC = 16; % Columns in block.
 wholeBlockRows = floor(rows / blockSizeR);
 wholeBlockCols = floor(columns / blockSizeC);
 fprintf('\nSize of whole block is %d %d\n\n',wholeBlockRows,wholeBlockCols); 
 blockNumber=1;
 for row = 1 : blockSizeR : rows
	for col = 1 : blockSizeC : columns
		row1 = row;
		row2 = row1 + blockSizeR - 1;
		row2 = min(rows, row2); 
               % Determine starting and ending columns.
		col1 = col;
		col2 = col1 + blockSizeC - 1;
		col2 = min(columns, col2); % Don't let it go outside the image.
		% Extract out the block into a single subimage.
		oneBlock = grayImage(row1:row2, col1:col2);
                glcm=graycomatrix(oneBlock,'NumLevels',16);
                disp(glcm);
                subplot(16,16,blockNumber);
                imshow(oneBlock);
        caption2 = sprintf('Block #%d\n of %d', blockNumber,256);
		title(caption2, 'FontSize', fontSize);
		%drawnow;
        blockNumber = blockNumber + 1;
    end
  end

i has total of 11 rows and 16 columns i.e 185x256 when i calculate the GLCM

i got the error as

         Index exceeds number of subplots.

can u tell me how to solve this error...

which line of code should i add to the above code so that it can work well...

i've to only deal with the size 185x256..i dont want to use the function imresize...

1 Comment

Image Analyst on 10 Apr 2013

You could solve this a lot faster than waiting for us if you learn the concepts here: http://blogs.mathworks.com/videos/2012/07/03/debugging-in-matlab/

pammy

2 Answers

Answer by Ahmed A. Selman on 10 Apr 2013
Accepted answer

Just add

   clear 

at the very top of the code. Also these issues:

Line 26: change (oneBlocl)  to   (oneBlock)
Line 30: define the variable (blocks)
Line 31: define (fontSize) in the title argument

perhaps you want to add the command

clc

inside the loops to clean the screen while running (makes run a little bit faster)

After I've made the above minor fixes, it worked fine.

10 Comments

Walter Roberson on 11 Apr 2013

The scheme you had in your original posting was fine.

Ahmed A. Selman on 11 Apr 2013

Sure Pammy, it is your code and I only tried to slightly modify it for you. Please do not hesitate if you needed further modifications. Regards.

Ahmed A. Selman on 11 Apr 2013

But you used a smart technique in the original code, why not extending it if you want to change the block numbers?

Anyway, I've modified it a little bit further as below (works for any blockSizeR and blockSizeC) as:

... % the above lines are the same.
disp(glcm);
                if (blockNumber>blockSizeC*blockSizeR);return;end 
                subplot(blockSizeC,blockSizeR,blockNumber);
                imshow(oneBlock);
... % the rest of the code is the same. 

notice the new (if) statement. I've tried the new modifications at

blockSizeR=10 and blockSizeC=16; 
blockSizeR=20 and blockSizeC=20; 
blockSizeR=11 and blockSizeC=11; 

and all worked fine.

Ahmed A. Selman
Answer by Walter Roberson on 10 Apr 2013

Your code does not define "rows" or "columns"

6 Comments

Walter Roberson on 10 Apr 2013

What subplot(11,16,blockNumber) ? Your code only shows subplot(16,16,blockNumber)

If you have altered your code to use wholeBlockRows then remember that only counts whole rows, and does not take into account that there might be a partial row (as there is in this situation.)

pammy on 11 Apr 2013

sir subplot(16,16,blockNumber) when i m resizing my image and

subplot(11,16,blockNumber) when i m not resizing it...

@Ahmed A. Selman gave me a solution...his solution works well only when each row has 16 columns but what if each rows has less than 16 columns

that is;

as my grayImage is 185x256 then it has wholeBlockRows 12 and wholeBlockCols 16, the solution given to me works well for this but when the image size 185x190 then it does not work

tell me the solution of it sir....

Walter Roberson on 11 Apr 2013
 subplotrows = ceil(rows / blockSizeR);
 subplotcols = ceil(columns / blockSizeC);

then use

subplot(subplotrows, subplotcols);
Walter Roberson

Contact us