2015-03-03 1 views
-1

Я пытаюсь сделать динамическое пороговое значение, но появляется ряд ошибок. Я пытаюсь адаптировать из этого кода: http://www.inf.ed.ac.uk/teaching/courses/ivr/lectures/ivr5hand.pdfMatlab - Dynamic Thresholding

function [Output ] = dinamicthresh() 

[filename,pathname] = uigetfile('*.bmp; *.jpg', 'Please select an image file');  


I=fullfile (pathname,filename); 


I=imread(I); 


I=rgb2gray(I); 


I=im2double(I); 

[H,W]= size(I); 
Output= zeros(H,W); 

halfH=round(H/2); 
halfW=round(W/2); 

for i= H:H 
for j = W:W 
    C = I(i-halfH:i+halfH,j-halfW:j+halfW); 
    adaptative_thresh = mean(mean(C)) - 12; 
      if I(i,j) < adaptative_thresh 
     Output(i,j)= 1; 
      else 
     Output(i,j)= 0; 
    end 
end 
end 

subplot(1,2,1);imshow(I);title('Original Image'); 
subplot(1,2,2);imshow(Output);title('Adaptive Thresholding'); 

end 
+1

Могли бы вы предоставить некоторые информ об ошибках вы получаете и то, что часть коды дает вам ошибку? –

+0

В ваших циклах 'for' есть диапазоны' H: H' и 'W: W' ... каждый из них выполняется один раз. Это выглядит подозрительно. Я бы ожидал чего-то вроде «1: H» и «1: W». – beaker

ответ

0

Вашего алгоритм порогового сравнивает разницу между каждым пикселем и местным средним до заданного порогового значения.

Эта задача может быть выполнена гораздо более прямолинейно в Matlab, используя filter2.

Например, с этим изображением:

enter image description here

% --- Parameters 
w = 20; 
h = 20; 
th = 12; 

% --- Load image 
Img = double(rgb2gray(imread('Img.png'))); 

% --- Get the locally-averaged image 
Mean = filter2(fspecial('average', [h w]), Img); 

% --- Get thresholded image 
BW = (Img-Mean)>th; 

% --- Disply result 
imshow(BW) 

я получаю следующий результат:

enter image description here

Конечно, вы можете поиграть с параметрами, чтобы приспособить это кода к изображениям:

  • w ширина усреднения коробки
  • h является высота усреднения коробки
  • th является порогом для разности со средним.

Бест,