Forum: PC-Programmierung Leere/Schwarze Pixel füllen


von Gustl B. (-gb-)


Lesenswert?

Hallo,
ich habe viele Pixel mit Helligkeit, x-Position, y-Position die ich zu 
einem Bild bauen kann. Die x- und y-Position ist in 16Bit, sprich das 
kann man in ein 2**16 x 2**16 Bild bauen, aber es sind relativ wenige 
Pixel. Und zwar sind es grob 2**11 x 2**11 Pixel, aber eben nicht genau, 
sondern 27xx in die eine Richtung und 26xx in die andere Richtung. Die 
Füllen auch von den Rändern her das 2**16 x 2**16 Bild nicht aus, 
sondern nur einen Rechteckigen Bereich darin. Die Pixel zueinander 
hängen nicht zusammen, in x-Richtung ist der Abstand von je zwei Pixeln 
einer Zeile 16 bis 20 Pixel und in y-Richtung ist der Abstand von je 
zwei Pixeln einer Spalte 20 oder 21 Pixel.
Jetzt könnte man natürlich 2**16 x 2**16 auf 2**12 x 2**12 abbilden 
indem man die letzten 4 Bits der Positionen weglässt/durch 16 teilt, 
aber weil der Abstand der Pixel untereinander eben nicht 16 ist, hat man 
im resultierenden Bild Zeilen und Spalten die leer sind. Daher möchte 
ich das nicht machen.

Was ich machen möchte ist ein 2**14 x 2**14 Bild bauen, also die letzten 
2 Bits weglassen, und dann ale leeren Pixel füllen. Wie macht man das? 
Das 2**14 x 2**14 Bild mit 8Bit je Pixel habe ich, alle leeren Pixel 
haben den Wert Null. Jetzt würde ich das einfach weichzeichnen, aber 
dabei werden die Leeren Pixel mit berücksichtig, als Farbe schwarz. Ich 
möchte das eher so wie eine Wetterkarte mit Temperaturen die aus 
einzelnen Messstationen kommen, da werden ja auch irgendwie die 
Zwischenräume gefüllt ohne dass da Werte von Null mit verrechnet werden. 
Wie würde man das machen? Also quasi die Pixel mit ihrer Position als 
einzelne Helligkeitsmessungen auf einer Oberfläche betrachten und die 
nicht gemessenen Pixel ergänzen.

Hier https://gus.tl/offen/image_14bit.png ist ein solches Bild in 2**14 
x 2**14. Das ist leider kein festes Raster und hat auch viele Fehler. 
Ich will auch nicht, dass hier Jemand das für mich an diesem Bild löst, 
sondern möchte selber lernen wie man das Problem löst. Als Werkzeug 
würde ich gerne Python oder auch C verwenden.

Vielen Dank!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du könntest die "leeren" Pixel mit dem geringsten in Deinem Datensatz 
auftretenden Wert besetzen.

von Spiritus Rector (Gast)


Lesenswert?

Gustl B. schrieb:
>t. Als Werkzeug
> würde ich gerne Python oder auch C verwenden.
 Dann zeig mal als Datei im Anhang wie Dein bisheriges c oder python 
Prog ausschaut!

von Gustl B. (-gb-)


Lesenswert?

Rufus Τ. F. schrieb:
> Du könntest die "leeren" Pixel mit dem geringsten in Deinem Datensatz
> auftretenden Wert besetzen.

Was soll das bringen? Die haben doch jetzt schon den Wert 0 und damit 
den kleinsten Wert.

Spiritus Rector schrieb:
> Dann zeig mal als Datei im Anhang wie Dein bisheriges c oder python
> Prog ausschaut!

Äh hast Du meine Frage verstanden? Ich suche nach einer Idee wie man das 
löst. Und ohne Idee schreibe ich kein Programm. Ich habe das Script mit 
dem ich das Bild erstellt habe, das kann ich auch an anhängen. Was soll 
eigentlich diese Frage von Dir?

von Dirk K. (d-k)


Lesenswert?

Wenn Zeit kein wichtiger Faktor ist wuerde ich:
- Einen Satz neuer Pixelpositionen erzeugen (wo in deinem 2**16x2**16 
Raum willst du Pixel haben) die gleichmaessig ueber das Bild verteilt 
sind. (Das kann in einem Raster sein so dass jeder neue Pixel auch auf 
einer alten Pixlposition liegt, muss es aber nicht.)
- Dann den Intensitaetswert fuer jeden dieser Pixel per Interpolation 
aus den alten Pixelwerten (nur die gueltigen) erzeugen. Dazu wuerde ich 
es mit bilinear oder bicubic probieren. Mit den ungueltigen Werten 
dazwischen vermute ich dass du die Interpolation selbst from scratch 
implementieren musst.

Falls deine gueltigen Pixel unorganisiert sind koennte die Nachbarsuche 
teuer werden. (Aber das hast du ja schon, sonst koenntest du ja Momentan 
kein Bild erzeugen.)

von Gustl B. (-gb-)


Lesenswert?

Dirk K. schrieb:
> Mit den ungueltigen Werten
> dazwischen vermute ich dass du die Interpolation selbst from scratch
> implementieren musst.

Das wollte ich eigentlich vermeiden, aber vielen Dank!

Es gibt da ja fertige Funktionen in z. B. SciPy. Ich habe mir jetzt mal 
scipy.interpolate.griddata angeguckt: 
https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.griddata.html

Da verstehe ich aber das Beispiel nicht wie das funktioniert.
1
grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]
2
points = np.random.rand(1000, 2)
3
values = func(points[:,0], points[:,1])
4
grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')

Also mir geht es daraum, dass points 2 Dimensionen hat, das sind also 
Punkte in der Ebene. Ungeordnet.
Values bekommt Werte von func, das ist eine Funktion von x und y die 
einen Wert zurückliefert, values ist also eine Aneinanderreihung von 
Werte, ebenfalls ungeordnet.
Wie kann das interpoliert werden wenn unbekannt ist welcher Wert aus 
values zu welchem Ort in der Ebene gehört?
Ich würde das gerne mit meinem Bild machen, also alle Positionen der 
gültigen Pixel in points reinschreiben und dann alle Helligkeitswerte 
der gültigen Pixel in Values. Ich verstehe nur nicht wie das zugeordnet 
wird. Gibt es da eine feste Struktur und ich muss z. B. links oben 
anfangen bei 0,0 und rechts unten aufhören?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gustl B. schrieb:
> Was soll das bringen? Die haben doch jetzt schon den Wert 0 und damit
> den kleinsten Wert.

Dann allerdings ist vollkommen unklar, was Du jetzt eigentlich erreichen 
willst.

So kannst Du schließlich nicht zwischen leeren (d.h. nie von Dir mit 
Inhalt beschriebenen) und nichtleeren Pixeln unterscheiden.

Dann wirst Du nicht genutzte Pixel mit einem anderen Wert füllen müssen.

Sofern Du ein Bitmapformat verwendest, das Transparenz unterstützt, 
könntest Du vor dem Füllen der Bitmap alle Pixel auf 100% Transparenz 
setzen und beim Füllen mit Deinen Werten die genutzten Pixel auf 0% 
Transparenz.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

Nun, man kann ja z. B. durchs Bild iterieren und gucken ob Werte 0 sind 
oder nicht oder alle Nullen durch NaN ersetzen, ...

Es gibt auch fertige Funktionen wie scipy.interpolate.Rbf
Das funktioniert zwar in einem kleinen Beispiel wunderbar, bringt aber 
am großen Bild immer Memory Error. Wir haben 2017, ich habe viel RAM, 
ein 64Bit Python und sowohl unter Linux, OSX und Windows nutzt das 
maximal 4GBytes aus, oft nichtmal das sondern bringt einfach Memory 
Error ...

Edit:
So, jetzt mal ein Bildausschnitt als .png und ein Python das das 
interpolieren sollte, aber nur nach kurzer Zeit Memory Error bringt. 
Wieso kommt da der Fehler?

: Bearbeitet durch User
von Possetitjel (Gast)


Lesenswert?

Gustl B. schrieb:

> Also quasi die Pixel mit ihrer Position als einzelne
> Helligkeitsmessungen auf einer Oberfläche betrachten
> und die nicht gemessenen Pixel ergänzen.

Voronoi-Diagramm.

von egonotto (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,



wenn ich das Problem richtig verstanden habe, dann wäre eine Grundidee, 
die man nutzen könnte folgende:

Man sucht für einen "schwarzen" Punkt vier  "helle" Nachbarn und lässt 
diese die Helligkeit des "schwarzen" Punkts bestimmen.

Je näher, desto mehr Einfluss sollte sein.

Anbei ein paar Skizzen wie man so was machen könnte.

MfG

egonotto

von Spiritus Rector (Gast)


Lesenswert?

Gustl B. schrieb:

> Spiritus Rector schrieb:
> Dann zeig mal als Datei im Anhang wie Dein bisheriges c oder python
> Prog ausschaut!
>
> Äh hast Du meine Frage verstanden? Ich suche nach einer Idee wie man das
> löst. Und ohne Idee schreibe ich kein Programm. Ich habe das Script mit
> dem ich das Bild erstellt habe, das kann ich auch an anhängen. Was soll
> eigentlich diese Frage von Dir?

Mit der deklaration der beiden bildimages im Programm und deren 
initialisierung köntte man dein Problem besser verstehen. Im etsten Post 
bleibt unklar ob skaliert wird und ob der Rand Filtertypisch nach aussen 
erweitert wird. Ob Grauwert, RGBoder YUV bleibt auch unklar. Mit einem 
Programmgerüst wird klarer, was gegeben und und was gesucht ist und 
damit was die Datenverarbeitung läsen soll.

von Gustl B. (-gb-)


Angehängte Dateien:

Lesenswert?

@ egonotto:

Vielen Dank für Deine Mühe! Die Sache ist die, wie man interpoliert weiß 
ich, das will ich nicht zu Fuß machen und es gibt auch schon fertige 
Funktionen dafür die man benutzen kann. Das Problem ist eher, dass das 
Bild riesig ist und mir das Python immer einen Memory Error bringt. Mit 
griddata aus scipy.interpolate funktioniert es für kleinere Bilder recht 
gut.

Ich habe dann auch gesehen, dass ich in den interpolierten Bildern 
weiterhin seltsame Linien drinnen habe (siehe Anhang "Linien").
Das war nicht unspannend. Zum Glück habe ich die Daten nicht nur als 
Bild, sondern auch als Reihe von Messwerten (Helligkeit mit Position im 
Bild). Diese Reihe ist so, wie sie aufgenommen wurde der Zeit nach 
geordnet, ich konnte also Bilder rechnen die zeigen wie das Bild 
aufgebaut/abgetastet wurde. Im Anhang sind dazu Bildchen mit 
unterschiedlichem Zeitausschnitt, sie zeigen jeweils Helligkeitswert, 
horizontale Position (Sägezahn) und vertikale Position (Rampe).
Wie man vor allem bei reihe_10k gut sehen kann, gibt es in der 
horizontalen Position manchmal Fehler. Also Spitzen nach unten, wo diese 
herkommen weiß ich noch nicht, werde ich aber untersuchen. Jedenfalls 
haben diese Fehler zur Folge, dass der Helligkeitswert bei diesem Fehler 
an eine andere Position im Bild geschrieben wird als er vom 
Abtastvorgang her geschrieben werden sollte.
Ich werde jetzt erstmal versuchen diese Fehler rauszufiltern.

Edit:
Das war einfach. Die Fehler sind nur nach unten, man kann also alle 
Pixel wegwerfen deren horizontale Position kleiner ist als die des 
vorangegangenen Pixels (bis auf Zeilenwechsel). reihe_10k_filter im 
Anhang. Von den grob 5M Pixeln insgesamt die nicht leer sind wurden so 
300k Pixel entfernt.

: Bearbeitet durch User
von Gustl B. (-gb-)


Lesenswert?

So, mal ein Ergebnis:
Aus diesem 2**13 x 2**13 Ausschnitt eines 2**14 x 2**14 Bildes
https://gus.tl/offen/image_8k_filter.png
wurde ein 2**12 x 2**12 Bild interpoliert.
https://gus.tl/offen/image_4k_filter_interpolate.png

Ich bin damit jetzt erstmal zufrieden.

von TorbenK (Gast)


Lesenswert?

Gustl B. schrieb:
> Was soll eigentlich diese Frage von Dir?
Solche Fragen kommen immer. Von Zeithabern.

Anderes Beispiel in einem anderen Forum:
Frage: "Ab welchem Alter kann ich mit der Fahrschule beginnen?"
Antwort: "Dann zeig mal ein Foto des Autos, das du fahren willst".

Einfach ignorieren ^^

von Ordner (Gast)


Lesenswert?

TorbenK schrieb:
> Gustl B. schrieb:
>> Was soll eigentlich diese Frage von Dir?
> Solche Fragen kommen immer. Von Zeithabern.
>
> Anderes Beispiel in einem anderen Forum:
> Frage: "Ab welchem Alter kann ich mit der Fahrschule beginnen?"
> Antwort: "Dann zeig mal ein Foto des Autos, das du fahren willst".

Ist aber völlig berechtigt, den Führerschein für Landmaschinen (Klasse 
T,L)darf man früher machen als den für Sportwagen (Klasse B).

Bei Motorädern und Bussen  kann das Mindestalter auch schon mal 24 Jahre 
betragen:
http://www.tuev-sued.de/fuehrerschein_pruefung/fuehrerscheinklassen

> Einfach ignorieren ^^

Nö, auch hier gilt die Sesamstrasse "Wer nicht (nach-) fragt bleibt 
dumm"

von TorbenK (Gast)


Lesenswert?

Ordner schrieb:
> Nö, auch hier gilt die Sesamstrasse "Wer nicht (nach-) fragt bleibt
> dumm"

oder ist schon dumm ;)

von Gustl B. (-gb-)


Lesenswert?

Sie bringen in die vielschichtige Diskussion interessante neue
Aspekte ein, die die Problematik von einer völlig neuen Seite
beleuchten. Ihre Ausführungen zeugen von hoher Sachkenntnis und
überzeugen auch im Detail. Besonders im Mittelteil transportieren sie
eine Fülle hochwertiger Informationen, die dem Kreis der betroffenen
Nutzer nicht vorenthalten werden dürfen.

von Ordner (Gast)


Lesenswert?

Gustl B. schrieb:
> Sie bringen in die vielschichtige Diskussion interessante neue
> Aspekte ein, die die Problematik von einer völlig neuen Seite
> beleuchten. Ihre Ausführungen zeugen von hoher Sachkenntnis und
> überzeugen auch im Detail. Besonders im Mittelteil transportieren sie
> eine Fülle hochwertiger Informationen, die dem Kreis der betroffenen
> Nutzer nicht vorenthalten werden dürfen.

OK, auch wenns vom TO stammt spar ich mir hier das Nachfragen und 
ignorier den offensichtlichen Trollbeitrag.

von Torben K. (torbenk)


Angehängte Dateien:

Lesenswert?

Ich verstehe Ausdrücke wie '2**14' nicht. Was willst du damit sagen?

Ansonsten entstehen beim Vergrößern ungewöhnliche Muster. Was ist das?

von Gustl B. (-gb-)


Lesenswert?

2**14 ist die Anzahl der Bildpunkte in eine Richtung. Also vom gesamten 
Bild. Darin sind aber nur relativ wenige Pixel tatsächlich ungleich 
Null.

Tja was das Muster genau ist weiß ich auch nicht, das war wohl die 
Probenoberfläche die im TEM lag.

Ich habe das alles hier https://gus.tl/wp/?p=168 zusammengefasst. Das 
Projekt ist aber noch nicht am Ende.

von Ordner (Gast)


Lesenswert?

Torben K. schrieb:
> Ich verstehe Ausdrücke wie '2**14' nicht. Was willst du damit sagen?

Wahrscheinlich meint er damit das er einem mit 14bit codierten Wert hat, 
also einen Wertebereich von 0 bis 16383 (2 hoch 14 minus 1 -> '**' ist 
der Exponentiation-Operator in VHDL), aber ist irgendwie unfähig sich in 
einer für Normalsterbliche verständliche Art und Weise auszudrücken.

von TorbenK (Gast)


Lesenswert?

Gustl B. schrieb:
> 2**14 ist die Anzahl der Bildpunkte

Also 392 (2*14*14).

von Gustl B. (-gb-)


Lesenswert?

Nein, 2 hoch 14. Ist das echt so schwer? ** ist in mehreren Sprachen die 
Exponentialschreibweise. Hättest Du 2^14 verstanden? Wenn ja warum das 
und nicht 2**14? Aber da Du sowieso nichts sinnvolles beizutragen hast 
fasse ich das mal als verfrühtes Freitagstrollposting auf.

TorbenK schrieb:
> Gustl B. schrieb:
>> 2**14 ist die Anzahl der Bildpunkte
>
> Also 392 (2*14*14).

Wie Du von 2**14 auf 2*14*14 kommst verstehe jetzt ich nicht. Die Anzahl 
der * bleibt zwar gleich, aber eine 14 erfindest Du dazu.

von Roland F. (rhf)


Lesenswert?

>> Dann zeig mal als Datei im Anhang wie Dein bisheriges c oder python
>> Prog ausschaut!
>
>> Äh hast Du meine Frage verstanden? ... Was soll eigentlich diese Frage
>> von Dir?

und

> Nein, 2 hoch 14. Ist das echt so schwer? ** ist in mehreren Sprachen die
> Exponentialschreibweise. Hättest Du 2^14 verstanden? Wenn ja warum das
> und nicht 2**14? Aber da Du sowieso nichts sinnvolles beizutragen hast
> fasse ich das mal als verfrühtes Freitagstrollposting auf.

Was für unverschämte, hochnäsige Reaktionen auf die Hilfe von Anderen. 
Hoffentlich hilft dir hier keiner mehr.

rhf

von Gustl B. (-gb-)


Lesenswert?

Und ... der nächste Troll, herzlich willkommen!

Ich hatte im Eingangspost nicht nach Code oder sonst was gefragt, 
sondern nach einer Idee wie man solche fehlenden Pixel füllt. Ich hatte 
selber also keine Idee für eine Lösung, und dann habe ich natürlich auch 
noch keinen Code, wie so auch? Fängst Du an ein Programm für ein Problem 
zu schreiben obwohl du noch keine Lösungsstrategie kennst? Ich mache das 
nicht so. Und dann kam da diese Aufforderung.

Roland F. schrieb:
>>> Dann zeig mal als Datei im Anhang wie Dein bisheriges c oder python
>>> Prog ausschaut!

Und zwar nur diese Aufforderung ohne irgendwelche Hilfe. Das ist wie 
weiter oben bei dem Vergleich mit dem Führerschein. Ja, mann kann frage 
was man schon hat, aber das sollte man dann auch begründen, mich hätte 
hier interessiert was genau sich Spiritus Rector erhofft.
Weiter unten hat er dann auch detailierter nachgefragt, aber da hatte 
ich das schon selber geschafft mit dem Interpolieren.

Roland F. schrieb:
> Was für unverschämte, hochnäsige Reaktionen auf die Hilfe von Anderen.
> Hoffentlich hilft dir hier keiner mehr.

Du hast hier jedenfalls nicht geholfen.

: Bearbeitet durch User
von Roland F. (rhf)


Lesenswert?

> Und ... der nächste Troll, herzlich willkommen!

Flegel!

> Roland F. schrieb:
>>>> Dann zeig mal als Datei im Anhang wie Dein bisheriges c oder python
>>>> Prog ausschaut!

Lerne erst mal richtig zu zitieren und unterstelle nicht anderen 
Aussagen, die sie nicht gemacht haben.

> Du hast hier jedenfalls nicht geholfen.

Nein, habe ich nicht. Und selbst wenn ich die perfekte Lösung für dein 
Problem wüsste, von mir würdest du sie nicht erfahren. Leute wie dich 
muss man dumm sterben lassen.

rhf

von Gustl B. (-gb-)


Lesenswert?

Roland F. schrieb:
> Lerne erst mal richtig zu zitieren und unterstelle nicht anderen
> Aussagen, die sie nicht gemacht haben.

Ich hatte Dich zitiert. Und wem habe ich was unterstellt was der so 
nicht geschrieben hat?

Roland F. schrieb:
> Nein, habe ich nicht. Und selbst wenn ich die perfekte Lösung für dein
> Problem wüsste,[...]

Also nicht geholfen und weißt auch nicht die Lösung, was machst Du also 
hier? Deine Lebenszeit mit sinnlosen Post vertun? Gratulation!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.