WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Hough-Transformation

 

hurzt
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 07.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2011, 11:09     Titel: Hough-Transformation
  Antworten mit Zitat      
Hallo,

ich beschäfftige mich schon seid geraumer Zeit mit Objekterkennung in Bilder.
Ich habe *.jpg's vorliegen die ich bearbeiten muss.

Nach einiger Recherche hab ich heraus bekommen da man Objkterkennung über den Canny-Algorithmus und der Houghtransformation machen kann.

Die mir vorliegenden Bilder hab ich erstmal vorbereitet, d.h. diese wurden im rgb-Farbraum linearisiert und die "Farbflecken" die mich interessieren wurden extrahiert. Ich habe also nun ein Bild mit weißen hintergrund und roten/blauen Flecken da drauf.
die Flecken entsprechen genau meinen gesuchten Fehlern.

bei mir im Programm sieht die Vorbereitung folgendermaßen aus:

Code:
clear all, clc;

Bild=imread('Bild.jpg');
Bild=linBild(Bild);
Bild=rbFilter(Bild);
 


wobei linBild und rbFilter selbst geschriebene Funktionen sind. (siehe Anhang)

Soweit wie meine Recherchen ergeben haben wäre der nächste Schritt der sogenannte Canny-Algorithmus, der in Matlab wie folgt aussieht:

Code:

a=rgb2gray(Bild);
Im=edge(a,'canny');
imshow(Im)
 


Ich habe sozusagen nun ein schwarzes Bild auf den meine Fehler weiß umrandet zu sehen sind.

meine Frage ist, wie kriege ich da nun eine Formerkennung raus?
Angeblich soll das mit der Hough-Transformation funktionieren.

Kann mir wer eventuell erklären wie das Praktisch zu bewerkstelligen ist?
Ein Link oder Hinweise darauf wo ich eine Antwort finden könnte wären auch hilfreich.

Grüße,
Hurtz

Edit: es ist möglich, das die infos die in den Funktionen stehen nicht mehr ganz aktuell sind, also nicht wundern wenn da etwas steht das nicht ganz hin haut. Wink

rbFilter.m
 Beschreibung:

Download
 Dateiname:  rbFilter.m
 Dateigröße:  696 Bytes
 Heruntergeladen:  672 mal
linBild.m
 Beschreibung:

Download
 Dateiname:  linBild.m
 Dateigröße:  1.34 KB
 Heruntergeladen:  640 mal

_________________

"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
Private Nachricht senden Benutzer-Profile anzeigen


hurzt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 07.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2011, 08:46     Titel:
  Antworten mit Zitat      
Hallo,
das Problem hab ich letztendlich gelöst, nicht mit Hough, aber es liefert brauchbare Ergebnisse. Nach der Vorbereitung:

Code:

a = rgb2gray(Bild);
a = histeq(a);
bw = edge(a,'canny');

[L Ne]=bwlabel(bw);

sw = bwareaopen(bw, 10);

A=regionprops(logical(sw),'Area','FilledArea','MajorAxisLength','MinorAxisLength','Centroid')
 


Das dumme ist nun das sich teilweise überlagernde Objekte nicht getrennt werden. Auf den Bild sind aber die beiden Objekte durch Kontrastunterschied gut aus zu machen, also man sieht das da 2 Objekte sind.
sie sind nur durch eine gemeinsame Hintergrund miteinander verbunden.

gibt es eine möglichkeit den detailgrad der segmentierung zu erhöhen?

Grüße
hurtz
_________________

"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
Private Nachricht senden Benutzer-Profile anzeigen
 
hurzt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 07.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.05.2011, 13:05     Titel:
  Antworten mit Zitat      
Hallo,

ich hab mein filter etwas genauer eingestellt, so wie er gepostet ist sucht er nur nach Pixeln mit rot und blau anteilen und lässt die durch.

Das Ergebnis wird wesentlich besser wenn man zusätzlich noch nach Pixel mit Grünanteil filtert und Pixel mit ein zu hohen Anteil entfernt.
die einzelnen Objekte können dann auch besser getrennt werden.

praktisch sieht das bei mir so aus:

Code:
function C = rbFilter( img )
%filtert rot und blau und setzt rest weis
% gibt uint8 aus
%% variablen festlegen

[row col plane] = size(img);
img = double(img);
C = zeros(row,col,plane);
factor1 = max(img(:))/255; %rot-faktor
factor2 = max(img(:))*20/255; %blau-faktor
factor3 = max(img(:))*0.5; %grün-faktor

%% Filter berechnen

for i = 1:row
    for j = 1:col
        if (img(i,j,1) > factor1 && img(i,j,2) < factor3 && img(i,j,1) == max([img(i,j,1) img(i,j,2) img(i,j,3)]))
            C(i,j,1:3) = img(i,j,1:3);
        elseif (img(i,j,3) > factor2 && img(i,j,2) < (factor3*0.6) && img(i,j,3) == max([img(i,j,1) img(i,j,2) img(i,j,3)]))
            C(i,j,1:3) = img(i,j,1:3);  
        else
            C(i,j,1:3) = 255;                    
        end
    end
end
%% Ausgabe in ursprünglichen Format
C=uint8(C);
end


Es stellt sich dadurch aber ein neuer Effekt ein.
Ich habe nun über das gesamte Bild vereinzelnte Pixel.

der befehl:
Code:
medfilt2(C)


der ansich dafür gedacht ist diesen Salzsstreuereffekt zu entfernen, nimmt aber leider zu viel raus. Zumindest soweit ich dies bisher aus probiert habe.

Gibt es eine andere möglichkeit, alternative Befehle oder ähnliches um einzelne Pixel zu entfernen?

Grüße,
Hurtz
_________________

"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
Private Nachricht senden Benutzer-Profile anzeigen
 
hurzt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 07.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.05.2011, 08:28     Titel:
  Antworten mit Zitat      
Hallo,

ich weis nicht ob es wikrlich die Hough-Transformation ist, problem wurde aber gelöset. folgender Ablauf Segmentiert mein Bild. Leider gibt es noch Probleme wie: zwei nahe beieinander liegende Fehlerpunkte werden als einer erkannt.

Aber in Groben und Ganzen funktioniert dieser Ablauf.
Code:

Bild=zusBild(Bild);
Bild=linBild(Bild);
Bild=rbFilter(Bild);
A=segWert(Bild);
 


Problem ist also soweit gelöst.

Grüße,
hurzt

wertSeg.m
 Beschreibung:
Segmentiert das Bild und gibt alle werte von "regionprops" für die Segmente aus.
Liest Grayscale ein, gibt Struct-Matrix mit allen Werten aus.

Download
 Dateiname:  wertSeg.m
 Dateigröße:  500 Bytes
 Heruntergeladen:  631 mal
rbFilter.m
 Beschreibung:
Filtert den mich interessierenden Farbanteil des Bildes. Hier rot und blau, mit ein geringen grünen Farbanteil.
Liest uint8 ein, gibt grayscale aus.

Download
 Dateiname:  rbFilter.m
 Dateigröße:  946 Bytes
 Heruntergeladen:  604 mal
zusBild.m
 Beschreibung:
Schneidet mich interessierenden Bereich aus den Bild aus, hier ist der schnitt Kreisförmig.

Download
 Dateiname:  zusBild.m
 Dateigröße:  500 Bytes
 Heruntergeladen:  563 mal
linBild.m
 Beschreibung:
Linearisiert Bild, verringert so Streuung im Farbraum.
Uint8 einlesen, gibt uint8 aus.

Download
 Dateiname:  linBild.m
 Dateigröße:  1.32 KB
 Heruntergeladen:  565 mal

_________________

"der Wolf,das Lamm ... auf der grünen Wiese ... HURTZ!"
Private Nachricht senden Benutzer-Profile anzeigen
 
stratist9011
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 12.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2013, 17:02     Titel:
  Antworten mit Zitat      
Hi,

ich habe ein ähnliches Problem und habe jetzt mal versucht deinen Code an mein Problem anzupassen leider hat das nicht funktioniert.

Im Anhang ist das Bild das ich nach meiner Filterung und Segmentierung erhalte und ist genau das was ich babsichtige.
Jetzt will ich die Mittelpunkte der Rechtecke finden um dann eine Kurve durch diese zu legen.

Jetzt müsste ich doch zuerst einmal diese Rechtecke mit Matlab erkennen und diese durch ihre Eckpunkte beschreiben um dann den Mittelpunkt zu berechnen ?!?!? ...
Und genau da liegt das Problem wie bekomme ich Daten der Rechtecke, habe es mit regionprops versucht, allerdings komme ich da nicht so wirklich weiter. Wie kann ich dann wenn ich damit dann die Rechtecke beschreiben um die Mittelpunkte zu finden ? ...

Hier mal mein Code ...
Code:
%% Bild einladen und Kontrast erhöhen, Alles außer schwarz ausblenden und Struktur suchen
Test=imread('Wasser_2.jpg'); % Bild einlesen
A=double(Test);
B=rgb2gray(A);             % Graubild erstellen
C=imadjust(B,[0;1],[0;1]); % Kontrast von X erhöhen
C(C>10)=255;               % Alle Werte oberhalb 30 auf 255 setzen
imcontour(C);              % Sucht Kontur im Bild und plotted diese
imfill(C,'holes');
C = edge(C,'canny');       % Canny-Edge Detector
C=~C;                      % Invertierung, d.h schwarz gegen weiß vertauscht
imclearborder(C);
bwareaopen(C,15);
imshow(C);
%% Rechtecke finden
[L Ne]=bwlabel(C);                % Objekte "benennen"
C = bwareaopen(L, 15);            % kleine Objekte filtern
A=regionprops(logical(C),'all');  % Werte berechnen
 


Da ich an diesem Problem jetzt schon ein paar Tage sitze wäre es super wenn mri einer helfen könnte Confused

test.jpg
 Beschreibung:

Download
 Dateiname:  test.jpg
 Dateigröße:  32.26 KB
 Heruntergeladen:  849 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Leipziger
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.04.13
Wohnort: ---
Version: 2013a
     Beitrag Verfasst am: 23.04.2013, 22:49     Titel:
  Antworten mit Zitat      
Zum Verständnis der Hough Transformation und deren Verwendung fand ich das folgenden Eintrag im File Exchange recht hilfreich. Allerdings ist er für große Bilder nicht sehr geeignet- bzw die Methode der Hough Transformation im Allgemeinen.

http://www.mathworks.com/matlabcent.....ugh-transform-for-circles
Private Nachricht senden Benutzer-Profile anzeigen
 
Leipziger
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.04.13
Wohnort: ---
Version: 2013a
     Beitrag Verfasst am: 23.04.2013, 22:55     Titel:
  Antworten mit Zitat      
Zum neuen Anliegen sei gesagt, dass regionprops eine structure erstellt, in der die Eigenschaften deiner Regionen stehen. Ein Beispiel, dass ich mal zum Erkennen und Zentrieren von Ringen nutzte ist im folgenden Code zu finden. Vlt. kannst du es dir anhand dessen schon selbst erklären. Falls nicht, frage ruhig nach...

Code:

[handles.I,handles.map]=imread(uigetfile());
handles.I = ind2gray(handles.I,handles.map);
handles.I = im2double(handles.I);
[handles.m,handles.n]=size(handles.I);
imshow(handles.I);

handles.regions = bwlabel(logical(handles.I),4); % teilt zusammen gehörenden pixeln gemeinsame werte zu
handles.MOV = max(mode(handles.regions)); % sucht wert der größten region
handles.regions(handles.regions~=handles.MOV)=0; % Werte ungleich MOV null setzen
handles.regions = bwlabel(handles.regions,4);
handles.stats = regionprops(logical(handles.regions),'all');

handles.k = 2^(nextpow2(handles.m));
handles.j = (2^(nextpow2(handles.m))-handles.m)/2;
handles.xpad=handles.m;
handles.ypad=handles.n;
handles.Ipad=padarray(handles.I,[handles.xpad handles.ypad],'circular','both');
handles.xcenter = handles.stats.Centroid(1);
handles.ycenter = handles.stats.Centroid(2);
handles.xmincrop=handles.xcenter-handles.m/2+handles.xpad-handles.j;
handles.xmaxcrop=handles.m-1+2*handles.j;
handles.ymincrop=handles.ycenter-handles.n/2+handles.ypad-handles.j;
handles.ymaxcrop=handles.n-1+2*handles.j;
handles.Icentered = imcrop(handles.Ipad,[handles.xmincrop handles.ymincrop handles.xmaxcrop handles.ymaxcrop]);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.