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

nachbarschaftsoperator?

 

Hilbert86
Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2011, 11:32     Titel: nachbarschaftsoperator?
  Antworten mit Zitat      
Hallo Leute

gegeben ist ein grauwert bild mit bekannten ca 100 startpixeln.

ich möchte gern ein nachbarschaftsoperator programmieren der die startpixel nimmt und deren 8 nachbarpixel prüft (bsp. grau wert) wenn der wert in einem bestimmten threshold liegt soll dieser punkt zum pixel dazugefügt werden und das selbe immer mit den neu hinzugefügten pixel bis der threshold nicht mehr erfüllt ist. So das ich aus einem startpixel ein objekt bekomme das durch diesen vergleich der nachbarn gewachsen ist in jede richtung (Region Growing)

mein problem liegt in der programmierung der prüfung der nachbar pixeln. wie könnte man das realisieren ?

als erstes könnte man ja eine 0 matrix erstellen mit größe des bildes und dann die stellen die eingebunden werden mit 1 setzen.

grüße
hilbert
_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen


Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 22.07.2011, 10:57     Titel:
  Antworten mit Zitat      
Hallo,

ja, zuerst würde ich eine Matrix aufstellen mit Nullen bzw. dort, wo die Pixel sind, mit 1 (oder true/false). Dann vielleicht so in etwa:
Code:

% suche Pixel:
[i,j]=find(A);
% bestimme zu allen die jeweils 8 Nachbarn:
iN = [i-1;i;i+1;i-1;i+1;i-1;i;i+1];
jN = [j-1;j-1;j-1;j;j;j+1;j+1;j+1];
% und setze sie in die Matrix:
idx = sub2ind(size(A), iN, jN);
 

wobei bevor Du sie in die matrix setzt, noch den Threshold checken musst ...

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Hilbert86
Themenstarter

Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2011, 14:00     Titel:
  Antworten mit Zitat      
genau das war auch mein erster gedanke aber so überprüfe ich nur die ersten 8 nachbarpixel ich möchte aber auch die 16 pixel mit abstand einsweiter und die 32 pixel mit abstand einsweiter und ...40,48....und so weiter überprüfen.

Also eine art wachsender quadrat in der jede schicht geprüft wird bis die letzte schicht keine zu markierenden pixel mehr hat.

Hoffe konnte das einiger maßen gut erklären
_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Hilbert86
Themenstarter

Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2011, 12:52     Titel: Veranschaulichung des Problems
  Antworten mit Zitat      
Ich habe mein Problem mal mit einem Bild verdeutlicht ich denke man erkennt es besser wenn man es visuell vorliegen hat.

Die ersten 8 Nachbarn zu überprüfen hätte ich so gemacht wie Titus es beschrieben hatte.
Aber wie überprüfe ich jetzt die nächsten Schichten von Nachbarn Pixel in einer Schleife?

Abbruch kriterium ist ganz einfach wenn alle Pixel einer Schicht ein Kriterium nicht mehr erfüllen wird aufgehört.

Man könnte den Code von Titus erweitern so das für jede Schicht 2 Zeilen Code geschrieben werden (16,24,32 unsw ) bei großen Matrixen 400x400 ist das aber nicht sinvoll, es müsste doch eine elegantere Lösung geben?

Wäre für jeden Tipp dankbar


Hilbert

regiongrow.png
 Beschreibung:

Download
 Dateiname:  regiongrow.png
 Dateigröße:  3.9 KB
 Heruntergeladen:  960 mal

_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 06.08.2011, 13:57     Titel:
  Antworten mit Zitat      
Hallo,

ich denke die folgende Lösung sollte sowohl schnell als auch variabel genug sein:
Code:

test = randi(10,[10 10]); % test data

filterSize = [5 5]; % x- and y direction ([3 3] = 8 neighbors, [5 5] = 16 neighbors, [7 7] = 24 neighbors...)
offset = (filterSize-1)/2;
idxCol = 0:filterSize(1)-1;
idxRow = 0:filterSize(2)-1;

point = [5 5]; % current point

Values = test(point(1)-offset(1)+idxCol,point(2)-offset(2)+idxRow); % get all values in filter Mask
Values(2:end-1,2:end-1) = 0; % exclude (set to zero) non border Pixels

% do threshold operations
 


Das einzige was hier noch zusätzlich beachtet werden müsste sind die Randpixel, bzw. jene Pixel in der Filter-Maske für die im Testdatensatz die zugehörigen Indexe nicht existieren. Also haben wir z.B. einen 5x1 Filter dann bräuchten wir mindestens 2 Pixel zur linken und rechten Seite, ansonsten würden wir einen Dimensionsfehler vo Matlab erhalten. Dies koennte z.B. durch vorheriges padden gelöst werden (doc padarray). So würde sichergestellt das die Indexe auch im Originaldatensatz existieren.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Hilbert86
Themenstarter

Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2011, 15:04     Titel:
  Antworten mit Zitat      
Das ist echt ein toller Ansatz den kann man weiter ausbauen.
Was mich jetzt aber noch stört ist das am ende die Komplette Maske mit Werten gesetz wird. Wie könnte man das machen das eben nur die Randwerte gesetz werden? Weil wenn später eine Schleife eingebaut werden soll würde das die Stellen die vlt nicht mit 1 gesetz werden sollen einfach überschreiben!

Wie setz ich also nun nur die Rand Pixel von Values der Maske?


Sco hat Folgendes geschrieben:

Code:


Values = test(point(1)-offset(1)+idxCol,point(2)-offset(2)+idxRow); % get all values in filter Mask
Values(2:end-1,2:end-1) = 0; % exclude (set to zero) non border Pixels

% do threshold operations
 



_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 07.08.2011, 16:51     Titel:
  Antworten mit Zitat      
Hallo,

köntest du vielleicht ein Beipiel geben (mit Matrix davor und wie du sie möchtest), ich stehe gerade ein wenig auf dem Schlauch und verstehe nicht so ganz was du meinst.

Vielleicht sowas in der Art, damit würdest du nur die Werte der Randpixel bekommen:

Code:

% statt   Values(2:end-1,2:end-1) = NaN;
Values(2:end-1,2:end-1) = NaN; % exclude (set to zero) non border Pixels
borderPixels = Values(~isnan(Values));

% oder ohne Nan
Values = test(point(1)-offset(1)+idxCol,point(2)-offset(2)+idxRow); % get all values in filter Mask

mask = true(filterSize);
mask(2:end-1,2:end-1) = 0;
borderPixels = Values(mask);
 


Aber ich habe so das dumpfe Gefühl dass du was anderes meinst Smile.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Hilbert86
Themenstarter

Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2011, 17:27     Titel:
  Antworten mit Zitat      
Smile Also wenn du das Bild in der Anlage mal anschaust. Da haben wir ja wie beim Atom Hüllen. Und ich möchte in ner Schleife die Hüllen überprüfen. So wie es jetzt ist wird die Komplette Maske mit 1er gesetzt. Ich will aber nur die jeweilige Hüllen (Randpixel der Maske).
Bsp:
Ich überprüfe die 8er Hülle und setze diejenigen Pixel mit 1 die eine Bedingung erfüllen. Dann Überprüfe ich die 16er Hülle wobei die 8er Hülle nicht Überschrieben werden darf und so weiter. Das wächst dann solange bis eine Hülle keine Pixel mehr hat die eine bestimmte Bedingung erfüllen somit hört die Schleife auf.

Ich hoffe das war besser erklärt ? Smile sorry für meine Formulierung ich hatte Deutsch immer ne 4 Very Happy

Gruß
Hilbert

regiongrow.png
 Beschreibung:

Download
 Dateiname:  regiongrow.png
 Dateigröße:  3.9 KB
 Heruntergeladen:  915 mal

_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 07.08.2011, 17:55     Titel:
  Antworten mit Zitat      
Hallo,

du musst es so machen wie du es schon in deinem ersten Post angedeutet hattest. Du erzeugst eine leere Matrix mit der Größe deines Bildes, nennen wir sie "result".

Nun am Beispiel von:
Code:

% statt   Values(2:end-1,2:end-1) = NaN;
Values(2:end-1,2:end-1) = NaN; % exclude (set to zero) non border Pixels
idx = find(~isnan(Values)); % Index der Randpixel
 


Als erstes nehmen wir die Filteraske für 8 Nachbarn (3x3). Jetzt macht du deine Überprüfung NUR an den Pixeln die nicht NaN enthalten (natürlich sollte dein ürsprüngliches Bild kein Nan enthalten), welche ja die Randpixel sind. Erfüllt das Randpixel deine Bedingung, so setzt du für diese Stelle in der Matrix "result" den Wert 1. Dies machst du nun für alle Randpixel.
Daraufhin vergrößerst du die Filtermske (nächste Nachbarn-Schicht = 16 Nachbarn = 5x5 Filter) und wiederholst die vorherigen Schritte.

Da du die Bild- und "result"-Matrix immer getrennt voneinander behandelst wird auch nix überschrieben.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Hilbert86
Themenstarter

Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2011, 18:25     Titel:
  Antworten mit Zitat      
Super danke Smile
_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 07.08.2011, 18:39     Titel:
  Antworten mit Zitat      
Hallo,

hier noch ein lauffähiges Beispiel:
Code:

test = randi(10,[10 10]); % test data
result = zeros(10,10); % result (binary) matrix

filterSize = [5 5]; % x- and y direction ([3 3] = 8 neighbors, [5 5] = 16 neighbors, [7 7] = 24 neighbors...)
offset = (filterSize-1)/2;
idxCol = 0:filterSize(1)-1;
idxRow = 0:filterSize(2)-1;

point = [5 5]; % current point
temp = NaN(10,10); % temporary matrix to store the poisition of the image-section in the original image

Values = test(point(1)-offset(1)+idxCol,point(2)-offset(2)+idxRow); % get all values in filter Mask

temp(point(1)-offset(1)+idxCol,point(2)-offset(2)+idxRow) = 1; % set all pixel to 1 which are inside the filter Mask

Values(2:end-1,2:end-1) = NaN; % exclude (set to NaN) non border Pixels
temp(temp == 1) = Values; % transfer Values into the section in the original image
idxNonNaN = find(~isnan(temp)); % find non NaN Values
idxtrue = temp(idxNonNaN)>5; % find index of values bigger than 5
result(idxNonNaN(idxtrue)) = 1; % fill result matrix with 1 where Value>5
 


Die temporäre Matrix habe ich nur erzeugt, weil mir auf die schnelle kein eleganter Weg einfiel um von den Indexen des ausgeschnittenen Bildes (Filter-Maske) auf die korrespondierenden Indexe im Originalbild (bzw. der result-Matrix) zu kommen (da die Matrixgrößen uns somit die Indexe ja verschieden sind). Vielleicht hätte dafür ja jemand eine Lösung parad?

MFG

Sco
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.