2012-04-18 2 views
-3

Я не могу получить, как запустить его, может ли кто-нибудь мне помочь в этом, пожалуйста.индекс за пределами в matlab

Я получаю эту ошибку:

K>> [minutiae_valid]=postprocess_TICO(B,im,~K) 
??? Attempted to access wind(273,386); index out of bounds because size(wind)=[368,385]. 

Error in ==> postprocess_TICO at 214 
if (thinned(p,q)==1)&&(wind(p,q)==0) 

postprocess_Tico

function [minutiae_valid]=postprocess_TICO(minutiae_valid,im1,thinned) 
% clc; 
% close all; 
% clear all; 
cell=16;%total no. of cells needed in quantization; 
% im1= imread('E:\FINGERPRINT DATABASE\FVC2002\Dbs\Db1_a\16_6.tif'); 
wl=(33-1)/2; 
% no=20; 
% no2=20; 
% nox = 0; 
% noy = 0; %to choose border area 
% 
m=size(im1,1); 
n=size(im1,2); 
%m=(round(m/cell))*cell; 
%n=(round(n/cell))*cell; 
% im1=imresize(im1,[m n]); 
% im=double(im1); 
% figure; 
% subplot(1,2,1); 
% imshow(uint8(im)); 
% title('original input image'); 
% 
% %Identify ridge-like regions and normalise image-------------------------- 
% blksze = 10; 
% thresh =30; 
% M0=100; 
% STD0=150; 
% [thinim, mask] = imgenhance(im, blksze, M0, STD0); 
% subplot(1,2,2); subimage((thinim)); 
% title('Improved thinned input image', 'FontSize', 12); 
% INPUT_IMG=thinim; 
% 
% %minutiae extraction 
% thinned= INPUT_IMG; 
% img = INPUT_IMG; 
% [minutiae, minutiae_img, combined] = findminutiae(thinned, img); 
% totminu_I = size(minutiae,1) 
% figure, 
% subplot(1,2,1), subimage(combined), title('minutiae before postprocess.') 
% %______________________________________________________________ 
% %TO FIND BOUNDARY OF INPUT IMAGE AS WELL AS REGION OF FALSE MINU 
% mask_input=mask; 
% border=uint8(zeros(m,n)); 
% 
% [m,n]=size(mask); 
%  validr=uint8(zeros(m,n)); 
%  thin_temp=thinned; 
%  for i=1:m 
%   for j=2:n-1 
%    if((mask_input(i,j-1)==0)&&(mask_input(i,j)==1)&&(j<=n-no)) 
%      border(i,j)=1; 
%     validr(i,j-nox:j+no)=1; 
%      thin_temp(i,j-nox:j+no)=1; 
%    end 
%     
%    if ((mask_input(i,j+1)==0)&&(mask_input(i,j)==1)&&(j>no)) 
%      border(i,j)=1; 
%     validr(i,j+nox:-1:j-no)=1; 
%     thin_temp(i,j+nox:-1:j-no)=1; 
%    end 
%     
%   end 
%  end 
% 
%   for i=1:m 
%   for j=1:n-1:n 
%    if (mask_input(i,j)==1) 
%     if (j==1) 
%      border(i,j)=1; 
%     validr(i,j:j+no)=1; 
%     thin_temp(i,j:j+no)=1; 
%     end 
%     if (j==n) 
%      border(i,j)=1; 
%     validr(i,j:-1:j-no)=1; 
%     thin_temp(i,j:-1:j-no)=1; 
%     end 
%    end 
%   end 
%   end 
%  
%   
%   
% for j=1:n 
%   for i=2:m-1 
%    if((mask_input(i-1,j)==0)&&(mask_input(i,j)==1)&&(i<=m-no)) 
%      border(i,j)=1; 
%     validr(i-noy:i+no,j)=1; 
%      thin_temp(i-noy:i+no,j)=1; 
%    end 
%    if((mask_input(i+1,j)==0)&&(mask_input(i,j)==1)&&(i>no)) 
%      border(i,j)=1; 
%      validr(i+noy:-1:i-no,j)=1; 
%      thin_temp(i+noy:-1:i-no,j)=1; 
%    end 
%     
%   end 
% end 
% 
% for j=1:n 
%   for i=1:m-1:m 
%    if (mask_input(i,j)==1) 
%    if (i==1) 
%      border(i,j)=1; 
%     validr(i:i+no,j)=1; 
%     thin_temp(i:i+no,j)=1; 
%    else validr(i:-1:i-no,j)=1; 
%     thin_temp(i:-1:i-no,j)=1; 
%    end 
%    end 
%   end 
% end 
% 
% %___________________________________________________________________ 
% % removing minu at the border of roi 
% for x=1:size(thinned,1) 
% for y=1:size(thinned,2) 
%   if ((validr(x,y)==1)&&(thinned(x,y)==1)) 
%    combined(x,y,:)=[255,255,255]; 
%    minutiae_img(x,y,:)=[0,0,0]; 
%    
%   end 
% end 
% end 
%  
% for i=1:totminu_I 
%  x=minutiae(i,1); 
%  y=minutiae(i,2); 
%  if ((validr(x,y)==1)&&(thinned(x,y)==1)) 
%   minutiae(i,:)=0; 
%  end 
% end 
% %__________________________ 
% 
% subplot(1,2,2), subimage(combined), title('after boundary effect ') 
% minu_count=1; 
% minutiae_valid(minu_count, :) = [0,0,0,0]; %to make x, y, CN, theta value of minutiae not in border region. 
% for i=1:totminu_I 
%  CN=minutiae(i,3); 
%  if (CN~=0) 
%   minutiae_valid(minu_count, :) = minutiae(i,:); 
%   minu_count = minu_count + 1; 
%  end 
% end 

% totminu_I= minu_count-1; 


k=size(minutiae_valid); 
totminu_I=k(1,1); 
%FALSE RIDGE BIFURCATION 
for i=1:totminu_I 
if minutiae_valid(i,3)==3 
      wind=ones(m,n); 
     xi= minutiae_valid(i,1); 
     yi=minutiae_valid(i,2); 
     x=xi; 
     y=yi; 
     wind(xi-wl:xi+wl,yi-wl:yi+wl)=0; %window of size 25 cross 25 
     wind(xi,yi)=-1; 

     %mark '1', '2', '3'. 
     value=0; 

     r=x-1; 
     for c=y-1:y+1 
      if (thinned(r,c)==1)&&(wind(r,c)==0) 
       value=value+1; 
       wind(r,c)=value; 
      end 
     end 

     c=y+1; 
     for r=x-1:x+1 
      if (thinned(r,c)==1)&&(wind(r,c)==0) 
       value=value+1; 
       wind(r,c)=value; 
      end 
     end 

     r=x+1; 
     for c=y+1:-1:y-1 
      if (thinned(r,c)==1)&&(wind(r,c)==0) 
       value=value+1; 
       wind(r,c)=value; 
      end 
     end 

     c=y-1; 
     for r=x+1:-1:x-1 
      if (thinned(r,c)==1)&&(wind(r,c)==0) 
       value=value+1; 
       wind(r,c)=value; 
      end 
     end 


for value=1:3 %search '1'/'2/'3' value pixel arond the minutia point in the window. 
for p=x-1:x+1 
    for q=y-1:y+1 
     if wind(p,q)==value 
      xi=p; 
      yi=q; 
     end 
    end 
end 

cnt=0; 
     while(xi>x-wl)&&(xi<x+wl)&&(yi>y-wl)&&(yi<y+wl) %mark '1'/'2'/'3' to the adjacent connected pixels 
      k=0; 
      for p=xi-1:xi+1 
       for q=yi-1:yi+1 
        if (thinned(p,q)==1)&&(wind(p,q)==0) 
         wind(p,q)=value; 
          k=k+1; 
         if k==1 
          x1=p; 
          y1=q; 
         end 
         if k==2 %more than one connected pixel 
          cnt=cnt+1; 
          x2=p; 
          y2=q; 

          t1=x1; 
          x1=x2; 
          x2=t1; 

          t2=y1; 
          y1=y2; 
          y2=t2; 
          %___________ 
          xi=x2; 
          yi=y2; 

         while(xi>x-wl)&&(xi<x+wl)&&(yi>y-wl)&&(yi<y+wl) 
            k=0; 
            flag_see=0; 
          for p=xi-1:xi+1 

           for q=yi-1:yi+1 

            if (thinned(p,q)==1)&&(wind(p,q)==0) 
              wind(p,q)=value; 
              flag_see=1; 
              x3=p; 
              y3=q; 
              k=k+1;    
            end 
           end 
          end 
          if(flag_see==1) 
          xi=x3; 
          yi=y3; 
          else 
           xi=p; 
           yi=q; 

          end 

           if k==0 
           break 
           end 
          end 
%   xi=x1; 
%   yi=y1; 

         end 
        end 
       end 
      end 
      xi=x1; 
      yi=y1; 
      if k==0 
       break 
      end 
     end 

end 

% figure,subimage(wind); 
%to count 0-1, 0-2, 0-3 transition around the boundary clkwise 
T=1; 
for v=1:3 
     T0v=0; 
     r=x-wl; 
     for c=y-wl:y+(wl-1) 
      if (wind(r,c)==0)&&(wind(r,c+1)==v) 
       T0v=T0v+1; 
      end 
     end 

     c=y+wl; 
     for r=x-wl:x+(wl-1) 
      if (wind(r,c)==0)&&(wind(r+1,c)==v) 
       T0v=T0v+1; 
      end 
     end 

     r=x+wl; 
     for c=y+wl:-1:y-(wl-1) 
      if (wind(r,c)==0)&&(wind(r,c-1)==v) 
       T0v=T0v+1; 
      end 
     end 

     c=y-wl; 
     for r=x+wl:-1:x-(wl-1) 
      if (wind(r,c)==0)&&(wind(r-1,c)==v) 
       T0v=T0v+1; 
      end 
     end 

T1=T0v==1; 
    T=T & T1; 
end 
     if T~=1 
      minutiae_valid(i,:)=[0 0 0 0]; 
      combined(x,y,:)=[255,255,255]; 
     end 

end 
end 


minu_count=1; 
minutiae_valid_final(minu_count, :) = [0,0,0,0]; %to make x, y, CN, theta value of minutiae not in border region. 
for i=1:totminu_I 
    CN = minutiae_valid(i,3); 
    if (CN~=0) 
     minutiae_valid_final(minu_count, :) = minutiae_valid(i,:); 
      minu_count = minu_count + 1; 
    end 
end 

% totminu_I= minu_count-1; 
minutiae_valid = minutiae_valid_final; 

% figure, subimage(combined); 
+2

Вы не можете просто сбросить весь свой код здесь и ожидать, что мы исправим его. Создайте максимально возможный тестовый сценарий, а затем опубликуйте его. –

+0

@OliCharlesworth я не смог получить то, что проблема, так что просто свалил код .. может у вас есть вид –

+7

Нет. Переполнение стека не является местом, чтобы заставить людей отлаживать вас. Сначала выполните некоторую отладку, чтобы вы могли изолировать простую 10-строчную часть кода, которая вызывает проблему. –

ответ

2

В строках 212 и 213 вы создаете вложенные циклы, что цикл по девять элементам ветра ищут элементы, которые соответствуют какому-то условию , Когда вы его найдете, вы меняете центр вашего девяти элементарного блока.

Проблема возникает, когда центр вашего блока находится на краю ветра. Когда вы просматриваете девять элементов, расположенных по краю, вы не должны обращаться к индексам одинаково, иначе вы получите ошибку, как указано выше. Чтобы проиллюстрировать простой случай этого:

a = rand(4,4); 
for p=2:4 
    for q = 1:3 
    tmp += a(p,q) 
    end 
end 

суммирует 9 элементов (квадратный массив) с центром в точке (3,2).

a = rand(4,4); 
for p=3:5 
    for q = 1:3 
    tmp += a(p,q) 
    end 
end 

будет генерировать ту же ошибку, что у вас есть, когда он пытается получить доступ к а (5,1), так как этот элемент массива не существует. Правильный способ исправить это зависит от того, что вы пытаетесь сделать, но это, безусловно, выходит за рамки вашего вопроса и нашей способности понять.

Надеюсь, это поможет.

Повторяю некоторые комментарии, я хотел бы предложить вам совет. В будущем вы, скорее всего, получите ответы на теги, качественные ответы, если вы можете свести свой вопрос до кратчайшего возможного теста. Это также важный шаг в отладке вашего собственного кода. Выяснение того, как построить тестовый пример, часто дает ответ на вашу проблему. Когда это не очевидно, Stackoverflow - отличный ресурс.

Смежные вопросы