Punktwolke RGB zu HSV konvertieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

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
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte deinen bestehenden Code zeigen, und am besten Ausschnitte der tatsaechlichen Daten und deren Format.
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

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
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

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
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

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.
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

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]
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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()
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@mediamarc: Du mußt Deine rgb_to_hsv-Funktion so umschreiben, dass sie mit Vektoren arbeiten kann und dann einfach ganze Spalten konvertieren.
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

Okay, das wusste ich nicht. Vielen lieben Dank! Ich bin leider noch ein blutiger Anfänger, was Python angeht.
mediamarc
User
Beiträge: 16
Registriert: Freitag 1. Juli 2022, 09:24

@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
Antworten