Indexing errors with my function

조회 수: 7 (최근 30일)
Abdul Rahim Mohammad
Abdul Rahim Mohammad 2019년 5월 23일
댓글: Abdul Rahim Mohammad 2019년 5월 25일
Hello, Im trying to implement a morpholigcal hitormiss using erosion(erode_3x3 in the code) and I have a bit of trouble with my indexing, I used the erode function found in this forum post (Link: Erode), Here is my code:
function Imatch = hitormiss_3x3(I,M)
if (ndims(I)==3)
I=I(:,:,2);
end
if (isa(I,'uint8'))
I=double(I)/255;
end
% --------------- INSERT YOUR CODE BELOW -----------------
[r, c] = size(M); % initalise the size to iterate over structure element
B1s = zeros(size(M));
B0s = zeros(size(M));
for i = 1:c
for j = 1:r
if M(i,j)>0 %swapping out -1 to 0s and assign to B1
B1s(i,j) = M(i,j);
else
B1s(i,j) = 0;
end
if M(i,j)<0
B0s(i,j) = 1; %swapping out -1s to 1s and 1s to 0s and assign to B2
else
B0s(i,j) = 0;
end
end
end
imComp = imcomplement(I); %complement of I
Imatch = erode_3x3(I,B1s) & erode_3x3(imComp,B0s); %hitormiss usinng erode
% note use the erode_3x3 function call as part of your solution
return
% erode_3x3(I,S) - apply erosion using the 3x3 structure element S
function E = erode_3x3(I,S)
[p, q]=size(S);
[rows, columns] = size(I);
halfHeight = floor(p/2);
halfWidth = floor(q/2);
ErodedImage = zeros(size(I));
for col = (halfWidth + 1) : (columns - halfWidth)
for row = (halfHeight + 1) : (rows - halfHeight)
row1 = (row-halfHeight);
row2 = (row+halfHeight);
col1 = (col-halfWidth);
col2 = (col+halfWidth);
neighbourhood = I(row1:row2, col1:col2); %this is the part I think is where the indexing is wrong
pixelsInSE = neighbourhood(S);
ErodedImage(row, col) = min(pixelsInSE);
end
end
E = ErodedImage;
return
The main error I have here is, I tried changing the indexing to integers to but that didnt help either, can someone tell me whats wrong with my code and why the indexing is faulty? Thank you for your time and input.
Array indices must be positive integers or logical values.
Error in hitormiss_3x3>erode_3x3 (line 54)
pixelsInSE = neighbourhood(S);
Error in hitormiss_3x3 (line 31)
Imatch = erode_3x3(I,B1) & erode_3x3(imComp,B2); %hitormiss usinng erode
Error in hitormiss_test (line 7)
B1 = hitormiss_3x3(I,T1);
For refrence I have a test script that supplies this function with inputs which is as follows:
I = imread('hitmiss_image.tif');
I = double(I(:,:,1))/255;
T1 = [ -1 1 -1 ; 1 1 1 ; -1 1 -1 ]; % simple cross template
B1 = hitormiss_3x3(I,T1);
T2 = [ -1 0 -1 ; 0 1 0 ; -1 0 -1 ]; % centre set & zero diagonals
B2 = hitormiss_3x3(I,T2);
subplot(2,3,1); imagesc(I); colormap(gray); title('Input Image');
subplot(2,3,2); imagesc(T1); title('Template 1'); caxis([-1 1]);
subplot(2,3,3); imagesc(B1); title('Match 1');
subplot(2,3,5); imagesc(T2); title('Template 2'); caxis([-1 1]);
subplot(2,3,6); imagesc(B2); title('Match 2');
drawnow;

채택된 답변

Jan
Jan 2019년 5월 23일
Some of the indices are zeros.
if M(i,j)>0 %swapping out -1 to 0s and assign to B1
B1s(i,j) = M(i,j);
else
B1s(i,j) = 0;
end
...
erode_3x3(I,B1s)
But indices must be > 0 in Matlab.
  댓글 수: 3
Jan
Jan 2019년 5월 24일
At first I'd start with cleaning the code. You can replace:
[r, c] = size(M); % initalise the size to iterate over structure element
B1s = zeros(size(M));
B0s = zeros(size(M));
for i = 1:c
for j = 1:r
if M(i,j)>0 %swapping out -1 to 0s and assign to B1
B1s(i,j) = M(i,j);
else
B1s(i,j) = 0;
end
if M(i,j)<0
B0s(i,j) = 1; %swapping out -1s to 1s and 1s to 0s and assign to B2
else
B0s(i,j) = 0;
end
end
end
by
B1s = max(0, M);
B0s = double(M < 0);
Perhaps all you want to do is to replace:
pixelsInSE = neighbourhood(S);
by
pixelsInSE = neighbourhood(S(S~=0));
But without any meaningful comments in the code, it is impossible to guess this reliably. Remember, that all we see is the failing code. How could we know, what it should do instead?
Abdul Rahim Mohammad
Abdul Rahim Mohammad 2019년 5월 25일
Thank you for the help Jan, I solved the indexing issue by using :
pixelsInSE = neighbourhood( logical(S) )
Turns out this alone can fix the issue for my code where indices can be used as logical values
Array indices must be positive integers or logical values.

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Get Started with MATLAB에 대해 자세히 알아보기

제품


릴리스

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by