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
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
mingchuan zhao
2016년 10월 2일
Walter Roberson
2016년 10월 2일
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에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!