Newsgroup: it.comp.lang.c
Titolo: Trasformata di Hough

Ciao a tutti!
Sto cercando il codice sorgente della trasformata di Hough che 
permette di individuare le rette presenti all'interno di 
un'immagine.
Purtroppo però non ho trovato nulla scritto in C o C++, ma 
solamente codice Matlab. Qualcuno può aiutarmi a tradurlo? La 
funzione è molto breve... 
Vi ringrazio anticipatamente
Pier
% BASATO SUL PROGETTO DI
% Roberto Bisignano - Nicola Spiniello
% Visione Computazionale, anno accademico 2003-2004
% 
% Trasformata di Hough per linee in rappresentazione polare; il 
file matlab 
% principale e' linedet.m che si avvale di una funzione maxn.m.
% La funzione implementata ha i seguenti parametri di input:
% 
% [I2,lineimage]=linedet(nomefileimmagine,R,T,threshold)
% 
% dove con R si intende il numero di intervalli in cui si vuole 
% campionare lo spazio delle distanze dall'origine e con 
% T si intende il numero di intervalli in cui si vuole 
campionare 
% lo spazio degli angoli.
% threshold e' la soglia che si mette sulla trasformata di Hough
% 
function [A,lineimage]=linedet(nomefile,R,T,threshold)
immagine=imread(nomefile);
% se l'immagine di input e' a colori la si trasforma in livelli 
di grigio
% l'algoritmo di edge detection usato qui e' 'roberts'. se ne 
possono
% provare altri
if (size(immagine,3)~=1)
    image=edge(rgb2gray(immagine),'roberts');
    imagegray=rgb2gray(immagine);
else
    imagegray=immagine;
    image=edge(immagine,'roberts');
end;
[M,N]=size(image);
imshow(image);
maxro=sqrt((M^2)+(N^2));
dro=maxro/(R-1);
drom=dro/2;
dteta=pi/(T-1);
rod=[0:dro:maxro];
tetad=[0:dteta:pi];
A=zeros(R,T);
[i,j]=find(image==1);
for h=1:T
   rodvec=(i*cos(tetad(h)))+(j*sin(tetad(h)));
   for y=1:size(i,1)
      [c,k]=min(abs(rod-rodvec(y)));
      if (c<drom)
         A(k,h)=A(k,h)+1;
      end;
   end;
end;
I2=nlfilter(A,[3 3],@maxn); 
[irod,itetad]=find(I2>=threshold);
out=[rod(irod);tetad(itetad)];
% se non voglio sovrapporre le linee all'immagine scommento la 
riga qui di
% seguito
%lineimage=zeros(M,N);
%se voglio sovrapporre le linee all'immagine scommento la riga 
qui di
%seguito
lineimage=imagegray;
indexv=[1:(N*M)];
for i=1:size(out,2)
   seno=sin(out(2,i));
   coseno=cos(out(2,i));
   ro=out(1,i);
   vec=((indexv-((ceil(indexv/M)-1)*M))*coseno)+(ceil(indexv/M)
*seno);
   nuovo=find(abs(ro-vec)<0.5);
   lineimage(indexv(nuovo))=1;
end;
figure;
imshow(lineimage);
--  
Postato da Virgilio Newsgroup: scopri i nuovi gruppi 
Eros, foto e video a 
http://newsgroup.eros.virgilio.it

 funzione è molto breve... 
Qui non si tratta di spendere 10 minuti per aiutarti, ma
di impiegare almeno 2 ore.
Casomai ti puoi studiare matlab, provare a tradurre il codice,
e poi se qualche linea non ti torna, allora puoi chiedere,
anche se per la natura translinguistica forse it.comp.programmare
potrebbe essere piu' adatto.
Il codice *sembra* breve.
Prima di tutto il codice matlab non si traduce in
modo immediato in C perche' matlab usa in modo massiccio
operazioni su matrici e vettori. Quindi A=B+C puo'
essere una somma di numeri ma anche una somma di matrici,
per la quale bisogna produrre il codice corrispondente.
Usa cose come rod=[0:dro:maxro] per definire un vettore, e cose come
tetad(itetad) dove sia tetad che itetad sono vettori etc.etc.
Poi matlab ha predefinite un sacco di funzioni, che
ovviamente andrebbero implementate in C.
Alcune sono semplici, tipo zeros, find,
ma altre non lo sono affatto tipo nlfilter()
e edge() che fa edge detection e che richiedono
di essere implementate pure loro.
Io preferirei studiarmi l'algoritmo e implementarlo di sana
pianta, piuttosto che tradurre da un linguaggio che
non conosco, con i rischi del caso.
ciao,
g.

 Purtroppo però non ho trovato nulla scritto in C o C++, ...
Vai qui:
 
http://www.google.com/codesearch
e scrivi:
     hough.transform lang:c
M