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