Adaptive treshold

di il
5 risposte

Adaptive treshold

Ciao

sono un neofita di matlab e vorrei avere un consiglio per implementare un adaptive treshold che mi trasformi un immagine da "colorata" in un immagine in bianco e nero che scelga il valore di treshold automaticamente.
Il tutto dovrebbe essere fatto usando la convoluzione per evitare loop....

io ho provato il seguente codice

function bw=adaptivethreshold(IM,windows,C)
%  bw=adaptivethreshold(IM,C) outputs a binary image bw with the local 
%  threshold .
%  IM is the image
%  windows is the windows size
%  C costant


if (nargin<2)
    error('You must provide the image IM and teh costant C.');
end

%convertx matrix a of the image in the inensity matrix
IM=mat2gray(IM);

%imfilter filter the multidimensional array A (IM) with the multidimensional
%array B (fspecial('average',ws);with the option 'replicate'
%fspecial(type) creates a two-dimensional filter h of the specified type (in this case averagin filter).
mIM=imfilter(IM,fspecial('average',windows),'replicate');

figure,imshow (mIM),title ('mIm');
sIM=mIM-IM-C;
bw=im2bw(sIM,0);
figure,imshow (bw),title ('bw');
%compute the complement of the image
bw=imcomplement(bw);
ma come risultato mi esce un immagine in cui sono evidenziati i contorni delle figure mentre io dovrei avere un immagine in bianco e nero (come se usassi per esempio im2bw ('image') per capirci meglio)

qualcuno sa dove sbaglio e come faccio a correggermi ?

grazie mille in anticipo!

5 Risposte

  • Re: Adaptive treshold

    E' l'operazione di sottrazione tra l'immagine filtrata e l'immagine originale che ti mette in evidenza i bordi. E' come se stessi usando un filtro passa alto. E nel momento in cui usi la funzione im2bw per applicare la soglia, ovviamente ti rimangono solo i bordi messi in evidenza prima.
    Se visualizzi l'immagine sIM, puoi notare il problema.
    Poi, in questo caso, mi sembra che la scelta della soglia non sia molto "automatica", dipendendo fortemente dal valore di C...
    Sarebbe più "automatico" usare come soglia la media dell'immagine (o un suo derivato), ma ovviamente dipende da quello che devi fare!
  • Re: Adaptive treshold

    Ummmmmm grazie della risposta!

    mentre ero via per le vacanze ho modificato cosi!
    
    im1=imread('IMG_1.jpg');
    im2=imread('IMG_2.jpg');
    
    img1 = rgb2gray(im1);
    img2 = rgb2gray(im2);
    img1 = im2double(img1);
    img2 = im2double(img2);
    img2 = img2.*1.07;
    
    filter_size = 50;
    h = ones(filter_size)/(filter_size^2);
    
    result_img1 = conv2(img1,h,'same');
    figure (1); imshow(result_img1);
    
    bw_1 = img1 > result_img1;
    figure (2); imshow(bw_1);
    
    result_img2= conv2(img2,h,'same');
    figure (3); imshow(result_img2);
    
    bw_2 = img2 > result_img2;
    figure (2); imshow(bw_2);
    
    
    qui usa la convoluzione e il filtro h creato...questa dovrebbe essere migliore no?
  • Re: Adaptive treshold

    Bene! Lo stesso risultato lo ottieni utilizzando la funzione imfilter al posto di conv2, che concettualmente esprime meglio quello che stai facendo, ma il risultato è identico.
  • Re: Adaptive treshold

    Grazie del aiuto!
  • Re: Adaptive treshold

    Figurati
Devi accedere o registrarti per scrivere nel forum
5 risposte