index exceeds matrix dimension in image convolution

function y=convolve(Im,H) %#ok<*STOUT,*INUSD>
In=imread(Im);
I=im2double(In);
[rows,columns]=size(I); %#ok<*NOPRT,*ASGLU>
[rowsx,columnsx]=size(H);
C=0;
a=0;
b=0;
rowsy=rows-rowsx+1;
columnsy=columns-columnsx+1;
c=zeros(rowsy,columnsy);
for k=1:1:rowsy-1
for p=1:1:columnsy-1
for i=1:1:rowsx
for j=1:1:columnsx
T=I(i+a,j+b)*H(i,j);
C=C+T;
end
end
c(k,p)=C;
b=b+1;
end
a=a+1;
end
y=c;
Hi there, I am trying to code a two dimensional matrix convolution. However when I run this code there is an error: Index exceeds matrix dimensions.
Error in convolve (line 17) T=I(i+a,j+b)*H(i,j); But I cannot find where is wrong, can any one help? Thanks.

답변 (1개)

Walter Roberson
Walter Roberson 2016년 10월 2일
You have
I(i+a,j+b)
when i can be up to size(I,1) and j can be up to numels(I)/size(I,1) . Which, incidentally, is only the same as size(I,2) if I is two dimensional, which in turn implies that I is a grayscale image. Using size() the way you did is wrong for images that can be RGB.
Anyhow, suppose that the image is 2D so i can be up to the number of rows, and j can be up to the number of columns. But when i is equal to the number of rows, then i+a will be past the last row unless a is 0 (or negative), and j+b will be past the last column unless b is 0 (or negative.) But you have b=b+1; so b can become 1. When b does become 1, then as soon as j becomes columnsx, then j+1 would be past the end of I
Convolution with an array or vector produces a result that is larger than the original matrix. Have a look at the documentation for conv2() at the 'full' and 'same' and 'valid' options there, which are three different approaches for dealing with the size of output to be returned.

댓글 수: 2

rowsy=rows-rowsx+1;
columnsy=columns-columnsx+1;
c=zeros(rowsy,columnsy);
for k=1:1:rowsy-1
for p=1:1:columnsy-1
for i=1:1:rowsx
for j=1:1:columnsx
T=I(i+a,j+b)*H(i,j);
C=C+T;
I think i,j are for the filter. k,p for the image,so i,j wouldn't change,only a,b change,and I have written rowsy=rows-rowsx+1; columnsy=columns-columnsx+1; so I don't think convolution will produce a result larger than original matix.
At the command line command
dbstop if error
and run again. When it stops, look at i, a, j, b, and size(I) and size(H)

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Matrix Indexing에 대해 자세히 알아보기

질문:

2016년 10월 2일

댓글:

2016년 10월 2일

Community Treasure Hunt

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

Start Hunting!

Translated by