Seite 1 von 1
Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 09:33
von mediamarc
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
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 09:44
von __deets__
Bitte deinen bestehenden Code zeigen, und am besten Ausschnitte der tatsaechlichen Daten und deren Format.
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 10:13
von mediamarc
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
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 10:57
von __deets__
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.
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 11:07
von mediamarc
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:
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
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 11:10
von __deets__
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
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 11:27
von mediamarc
Der Code zum Einlesen:
Code: Alles auswählen
import pandas as pd
df = pd.read_csv("/home/bodenkunde/Schreibtisch/Traubenkirsche_Totholz_High.txt", sep=" ")
Vielen Dank für den Link. Ich werde mal versuchen die Spalten 4-6 auszuwählen.
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 11:46
von mediamarc
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]
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 14:00
von __deets__
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.
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 14:43
von __deets__
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()
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 14:48
von Sirius3
@mediamarc: Du mußt Deine rgb_to_hsv-Funktion so umschreiben, dass sie mit Vektoren arbeiten kann und dann einfach ganze Spalten konvertieren.
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Freitag 1. Juli 2022, 18:48
von mediamarc
Okay, das wusste ich nicht. Vielen lieben Dank! Ich bin leider noch ein blutiger Anfänger, was Python angeht.
Re: Punktwolke RGB zu HSV konvertieren
Verfasst: Montag 4. Juli 2022, 19:54
von mediamarc
@deets vielen, vielen Dank für deine Hilfe! Ich habe deinen Skript heute getestet (natürlich mit der korrekten RGB_to_HSV Funktion) und es hat alles einwandfrei funktioniert.
Gruß
M