index must be a positive integer or logical.

how to correct this error "Attempted to access thinned(0,2); index must be a positive integer or logical."
img = imread('5_1_4.jpg'); figure, imshow(img)
binary_image= im2bw(img,graythresh(img));
thinned=im2double(bwmorph(binary_image,'thin',Inf));
for x=1:size(thinned, 2)
for y=1:size(thinned,1)
if (thinned(x, y) == 1)
CN=(abs(thinned(x+1,y)-thinned(x+1,y-1))+ abs(thinned(x+1,y-1)-thinned(x,y-1))+ abs(thinned(x,y-1)-thinned(x-1,y-1))+ abs(thinned(x-1,y-1)-thinned(x-1,y))+ abs(thinned(x-1,y)-thinned(x-1,y+1))+ abs(thinned(x-1,y+1)-thinned(x,y+1))+ abs(thinned(x,y+1)-thinned(x+1,y+1))+ abs(thinned(x+1,y+1)-thinned(x+1,y)));
CN=CN/2;
end
end
end
end

 采纳的回答

Jan
Jan 2018-1-4
编辑:Jan 2018-1-4
You access the indices x-1, y-1 and x+1, y+1. Then replace:
for x=1:size(thinned, 2)
for y=1:size(thinned,1)
by:
for x = 2:size(thinned, 2) - 1 % [EDITED: x is 2nd dim, y is 1st dim]
for y = 2:size(thinned, 1) - 1
Currently you overwrite CN in each iteration. Is this wanted?
I think, that a proper indentation and sorting of the indices makes it much easier to debug:
% [EDITED, x and y swapped]
CN = (abs(thinned(y+1, x-1) - thinned(y, x-1)) + ...
abs(thinned(y+1, x) - thinned(y+1, x-1)) + ...
abs(thinned(y+1, x+1) - thinned(y+1, x))) + ...
abs(thinned(y, x-1) - thinned(y-1, x-1)) + ...
abs(thinned(y, x+1) - thinned(y+1, x+1)) + ...
abs(thinned(y-1, x-1) - thinned(y-1, x)) + ...
abs(thinned(y-1, x) - thinned(y-1, x+1)) + ...
abs(thinned(y-1, x+1) - thinned(y, x+1));
CN = CN/2;

4 个评论

Please remind kmla not to use (x,y) to index arrays because it so often leads to confusion. He should use (y, x) or better yet, just use the names (row, column). Too many people think arrays are indexed as (x,y) when they are NOT, and that will eventually, inevitably cause problems.
For example, see how x is defined x=1:size(thinned, 2) so that x goes over dimension 2 (columns) (which is correct) but in the loop
CN = (abs(thinned(x+1, y-1) - thinned(x, y-1)) + ...
x is being used as an index for dimension 1, not dimension 2. That is incorrect. This will cause problems in non-square matrices.
but they give this error also
Attempted to access thinned(241,18); index out of bounds because size(thinned)=[240,320].
for row = 2:size(thinned, 1) - 1
for col = 2:size(thinned, 2) - 1
cn = (abs(thinned(row+1, col-1) - thinned(row, col-1)) + ...
abs(thinned(row+1, col) - thinned(row+1, col-1)) + ...
abs(thinned(row+1, col+1) - thinned(row+1, col))) + ...
abs(thinned(row, col-1) - thinned(row-1, col-1)) + ...
abs(thinned(row, col+1) - thinned(row+1, col+1)) + ...
abs(thinned(row-1, col-1) - thinned(row-1, col)) + ...
abs(thinned(row-1, col) - thinned(row-1, col+1)) + ...
abs(thinned(row-1, col+1) - thinned(row, col+1));
CN(row,col) = cn/2;
end
end
@kmla: I asked, if overwriting CN is intended. Maybe you posted only a part of the code.
"but they give this error also" - we cannot know what "they" and "this" exactly means. Please be as clear as possible. Post a copy of the message.
Did you consider Image Analyst's comment already? I had overseen that the 1st and 2nd index have been confused. Now I've fixed the code I've posted.

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by