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!
Du könntest die "leeren" Pixel mit dem geringsten in Deinem Datensatz auftretenden Wert besetzen.
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!
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?
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.)
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?
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.
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
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.
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
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.
@ 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
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.
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 ^^
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"
Ordner schrieb: > Nö, auch hier gilt die Sesamstrasse "Wer nicht (nach-) fragt bleibt > dumm" oder ist schon dumm ;)
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.
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.
Ich verstehe Ausdrücke wie '2**14' nicht. Was willst du damit sagen? Ansonsten entstehen beim Vergrößern ungewöhnliche Muster. Was ist das?
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.
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.
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.
>> 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
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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.