Hallo zusammen,
ich habe folgendes Problem: ich möchte eine Punktwolke (.pts/.txt) von xyz rgb zu xyz hsv konvertieren. Die Formeln für die Konvertiereung von RGB zu HSV habe ich bereits umgesetzt, so dass einzelne RGB-Werte konvertiert werden. Nun möchte ich aber die gesamten RGB-Werte der Punktwolke kovertieren. Diese berfinden sich in Spalte 4 bis 6. Da ich sehr unerfahren im Umgang mit Python bin, wollte ich um ein paar Tipps bitten.
Gruß
M
Punktwolke RGB zu HSV konvertieren
Die Daten sehen wie folgt aus:
-2.34330 1.07448 -1.39108 129 123 109 -0.814567 -0.253069 0.521955
-2.34226 1.08515 -1.39093 118 111 100 -0.712917 0.166347 0.681232
-2.34360 1.08219 -1.39271 146 132 130 -0.884085 0.126298 0.449936
-2.34389 1.08426 -1.39375 117 108 105 -0.893399 -0.213467 0.395309
-2.34315 1.08293 -1.39212 149 137 130 -0.856361 0.031717 0.515402
-2.34345 1.08308 -1.39271 125 112 110 -0.900630 -0.007900 0.434515
Der Code sieht so aus:
def rgb_to_hsv(r, g, b):
r /= 255
g /= 255
b /= 255
maxc = max(r, g, b)
minc = min (r, g, b)
v =maxc
if minc ==maxc:
return 0.0, 0.0, v
s= (maxc-minc) / maxc
rc = (maxc-r) / (maxc-minc)
gc = (maxc-g) / (maxc-minc)
bc = (maxc-b) / (maxc-minc)
if r ==maxc:
h= 0.0 + bc -gc
elif g== maxc:
h= 2.0 + rc - bc
else:
h= 4.0 + gc- rc
h= (h/6.0) % 1.0
return h * 360, s * 100, v * 100
-2.34330 1.07448 -1.39108 129 123 109 -0.814567 -0.253069 0.521955
-2.34226 1.08515 -1.39093 118 111 100 -0.712917 0.166347 0.681232
-2.34360 1.08219 -1.39271 146 132 130 -0.884085 0.126298 0.449936
-2.34389 1.08426 -1.39375 117 108 105 -0.893399 -0.213467 0.395309
-2.34315 1.08293 -1.39212 149 137 130 -0.856361 0.031717 0.515402
-2.34345 1.08308 -1.39271 125 112 110 -0.900630 -0.007900 0.434515
Der Code sieht so aus:
def rgb_to_hsv(r, g, b):
r /= 255
g /= 255
b /= 255
maxc = max(r, g, b)
minc = min (r, g, b)
v =maxc
if minc ==maxc:
return 0.0, 0.0, v
s= (maxc-minc) / maxc
rc = (maxc-r) / (maxc-minc)
gc = (maxc-g) / (maxc-minc)
bc = (maxc-b) / (maxc-minc)
if r ==maxc:
h= 0.0 + bc -gc
elif g== maxc:
h= 2.0 + rc - bc
else:
h= 4.0 + gc- rc
h= (h/6.0) % 1.0
return h * 360, s * 100, v * 100
Bitte die Code-Tags benutzen, um Code und Daten darzustellen. Sonst gehen die relevanten Einrueckungen verloren.
Um die Daten einzulesen, empfiehlt sich mindestens das Modul csv aus der Standardbibliothek, oder das deutlich maechtigere pandas, welches extra installiert werden muss.
Mit einem von den beiden musst du dich vertraut machen, und erstmal versuchen, deine Daten einzulesen.
Um die Daten einzulesen, empfiehlt sich mindestens das Modul csv aus der Standardbibliothek, oder das deutlich maechtigere pandas, welches extra installiert werden muss.
Mit einem von den beiden musst du dich vertraut machen, und erstmal versuchen, deine Daten einzulesen.
Die Punktwolke habe ich bereits mit Pandas eingelesen. Ich frage mich nur, wie ich nun die RGB-Spalten auswählen und mit dem Skript verknüpfen kann.
Hier nochmal der Code:
Hier nochmal der Code:
Code: Alles auswählen
def rgb_to_hsv(r, g, b):
maxc = max(r, g, b)
minc = min(r, g, b)
v = maxc
if minc == maxc:
return 0.0, 0.0, v
s = (maxc-minc) / maxc
rc = (maxc-r) / (maxc-minc)
gc = (maxc-g) / (maxc-minc)
bc = (maxc-b) / (maxc-minc)
if r == maxc:
h = bc-gc
elif g == maxc:
h = 2.0+rc-bc
else:
h = 4.0+gc-rc
h = (h/6.0) % 1.0
return h, s, v
Und wo ist der Code zum einlesen? Sehe ich nicht.
Genauso wie zum Thema RGB to HSV (bei dem du ja auch erfolgreich Code gesucht und gefunden hast), findet sich zu dem Thema "Spaltenzugriff in Pandas" ein Meer an Informationen. ZB in den offiziellen Tutorials: https://pandas.pydata.org/docs/getting_ ... _data.html
Genauso wie zum Thema RGB to HSV (bei dem du ja auch erfolgreich Code gesucht und gefunden hast), findet sich zu dem Thema "Spaltenzugriff in Pandas" ein Meer an Informationen. ZB in den offiziellen Tutorials: https://pandas.pydata.org/docs/getting_ ... _data.html
Der Code zum Einlesen:
Vielen Dank für den Link. Ich werde mal versuchen die Spalten 4-6 auszuwählen.
Code: Alles auswählen
import pandas as pd
df = pd.read_csv("/home/bodenkunde/Schreibtisch/Traubenkirsche_Totholz_High.txt", sep=" ")
So. Nun habe ich die Datei eingelesen und die Spalten, in denen die RGB-werte gelistet sind, ausgewählt. Ich frage mich nur, wie ich jetzt die RGB dem Konvertierungs-Code zuführe, sodass alles 5Mio. Zeilen kovertiert werden.
Code: Alles auswählen
df = pd.read_csv("/home/bodenkunde/Schreibtisch/Traubenkirsche_Totholz_High.txt", sep=" ", header=None, usecols=(3, 4, 5))
print (df)
3 4 5
0 129 123 109
1 118 111 100
2 146 132 130
3 117 108 105
4 149 137 130
... ... ... ...
5543306 91 79 90
5543307 83 76 67
5543308 91 79 72
5543309 99 87 83
5543310 82 76 81
[5543311 rows x 3 columns]
Das ist Quatsch. Jetzt hast du alles bis auf die Spalten weggeworfen. Und damit kannst du dann deinen konvertierten Datensatz nicht abspeichern.
Und mit df.apply kannst du eine Funktion auf die Zeilen eines Dataframes anwenden.
Und mit df.apply kannst du eine Funktion auf die Zeilen eines Dataframes anwenden.
Das hier ist ein Beispiel, wie es gehen kann. Die Spaltennamen sind natuerlich ausgedacht.
Code: Alles auswählen
import io
import pandas
DATA = """F P Q R G B X Y Z
-2.34330 1.07448 -1.39108 129 123 109 -0.814567 -0.253069 0.521955
-2.34226 1.08515 -1.39093 118 111 100 -0.712917 0.166347 0.681232
-2.34360 1.08219 -1.39271 146 132 130 -0.884085 0.126298 0.449936
-2.34389 1.08426 -1.39375 117 108 105 -0.893399 -0.213467 0.395309
-2.34315 1.08293 -1.39212 149 137 130 -0.856361 0.031717 0.515402
-2.34345 1.08308 -1.39271 125 112 110 -0.900630 -0.007900 0.434515"""
def rgb_to_hsv(r, g, b):
return r * 2, g * 2, b * 2
def main():
df = pandas.read_csv(io.StringIO(DATA), sep=" ")
print(df)
hsv = df.apply(lambda row: rgb_to_hsv(row.R, row.G, row.B), axis=1, result_type='expand')
df[['R', 'G', 'B']] = hsv
print(df)
if __name__ == '__main__':
main()