Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Bildverarbeitung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.06.2011, 13:28 Uhr
flacker



Hi,

sry erstmal irgendwie viel mir dazu keine geeignete Überschrift ein.

Folgendes, also ich hab jeden Farbwert eines Pixels in einem Array. Jetzt ist das Problem das ich die Umgebung eines Pixels untersuchen muss. Heißt also zum beispiel alle Pixel um den Pixel selber also ein 3x3 Umgebung bzw 2 Pixel um den Pixel also eine 5x5 Umgebung.
Das Problem sind da ja nun die Ränder weil ich da ja außerhalb von dem Arraybereich komme und ich also das irgendwie abfangen muss. Das Problem is jetzt einfach das ich nich ganz weiß wie ich das effizient machen soll. Also für die 3x3 Umgebung habe ich das einfach mit if und else abfragen gemacht aber alleine da sind das schon 8 verschiedene Fälle ungefähr.
Jetzt brauch ich aber eine 5x5 Ungebung. Kann man das nicht irgendwie besser lösen? Es muss doch möglich sein das ich nich hunderte von Zeilen nur dafür schreiben muss.

Also hab mir ja schon selbst gedanken drüber gemacht und bin zu der Lösung gekommen das es vielleicht am besten wäre wenn man prüft ob ein bestimmter Index des Arrays vorhanden ist. Ist so eine Abfrage möglich oder geht das nicht?

Würde mich über weitere Vorschläge sehr freuen. Wenn es noch fragen gibt dann fragt einfach.

Mit freundlichen Grüßen

Markus Wiechmann
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.06.2011, 14:04 Uhr
Tommix



Hallo,
ein von der Geschwindigkeit ganz brauchbarer Weg ist es, zunächst mal nur den inneren Bereich, also ohne Rand, zu bearbeiten. Hier brauchst Du diese Sonderfälle nicht zu beachten. Die erste / letzte Zeile, Spalte usw. übernehmen dann andere Programmteile. Die können aufwändiger sein, sie bearbeiten ja viel weniger Daten.
Eine andere Methode wäre das Bild bzw. Array vorher nach links, rechts, oben und unten zu erweitern. Dann braucht überhaupt nur die Mitte bearbeitet zu werden und der Rand wird am Ende wieder entfernt.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.06.2011, 16:21 Uhr
Lensflare



Hallo flacker,

ich würde es so machen:


C++:
//int umgebung = 1; //3x3
int umgebung = 2; //5x5
const int w = 200; //bildbreite
const int h = 100; //bildhöhe
int a[w][h];

for(int y=0; y<h; ++y) {
    for(int x=0; x<w; ++x) {
        for(int uy=-umgebung; uy<=umgebung; ++uy) {
            for(int ux=-umgebung; ux<=umgebung; ++ux) {
                int ax = x+ux;
                int ay = y+uy;
                if(ax >= 0 && ax < w && ay >= 0 && ay < h) {
                    int color = a[ax][ay];
                }
            }
        }
    }
}



EDIT:

Zitat von flacker:
Also hab mir ja schon selbst gedanken drüber gemacht und bin zu der Lösung gekommen das es vielleicht am besten wäre wenn man prüft ob ein bestimmter Index des Arrays vorhanden ist. Ist so eine Abfrage möglich oder geht das nicht?

Bei c/c++ geht das nicht. Man muss die Größe des Arrays kennen und aus der Größe berechnen ob es einen Index gibt. In anderen Sprachen geht das zwar indirekt über Exceptions, aber das ist kein guter Programmierstil.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 24.06.2011 um 16:29 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.06.2011, 17:27 Uhr
~flacker
Gast


Erstmal vielen dank für die Antworten.

Das mit dem Bild erweitern is nicht schlecht. Daran hab ich auch schonmal halb dran gedacht.
Die Antworten haben wir sehr geholfen.

Und in php gibt es ja eine funktion isset() die das macht^^, so eine würde ich mir bei c++ wünschen.

Nochmals danke.

Mit freundlichen Grüßen

Markus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.06.2011, 18:43 Uhr
Lensflare




Zitat von flacker:
Und in php gibt es ja eine funktion isset() die das macht^^, so eine würde ich mir bei c++ wünschen.

Hab mal schnell bei Wikipedia nachgeguckt und scheinbar sind in php Arrays als Map umgesetzt. Das passt auch zu dem Namen der Funktion isset().
In c++ könnte man die Bilddaten auch in so einer Map-Datenstruktur speichern und dann mit sowas wie isset() abfragen, aber die wäre dafür nicht gut geeignet. Da bist du mit einem array besser bedient.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: