Seite 1 von 1

Prozentuale Anzeige der RGB Werte eines Bildes

Verfasst: Donnerstag 7. Januar 2021, 20:18
von Xalagy
Hallo zusammen,

zurzeit schreibe ich an einer BA in der ich unteranderem einige Bilder analysieren möchte. Diese Analyse soll mir hauptsächlich den prozentualen Farbanteil eines Bildes liefern, um später diese Bilder besser gruppieren zu können. Der Code selbst ist für die schriftliche Ausarbeitung der BA nicht von Interesse, sondern dient zur Archivierung und Organisierung meiner Daten. Da ich aus Datenschutzgründen keine Bilder hochladen darf, kann hier ein beliebiges Bild verwendet werden. Der Code sollte jedoch folgende Punkte beinhalten, welcher mir bei der Sortierung helfen soll:

1.) Wenn möglich sollte dieser in Jupyter 6.0.3 geschrieben werden

Mein Ansatz bisher:

bild = plt.imread("image.png") # Bild einlesen
plt.imshow(bild)

bild_rot = bildl[:,:,0] # Die einzelnen Spalten (RGB) als arrays extrahieren
bild_gruen = bild[:,:,1]
bild_blau = bild[:,:,2]

print(bild_rot) # arrays ausgeben
print(bild_gruen)
print(bild_blau)

(das array kann variieren, es geht mir nur um den codeablauf)

[[0.06666667 0.09803922 0.09411765 ... 0.47058824 0.49019608 0.49019608]
[0.08235294 0.1254902 0.10588235 ... 0.4862745 0.5058824 0.49803922]
[0.03921569 0.07450981 0.09019608 ... 0.49411765 0.5058824 0.49803922]
...
[0.7058824 0.7058824 0.7058824 ... 0.5019608 0.5058824 0.50980395]
[0.7019608 0.69803923 0.69803923 ... 0.50980395 0.5058824 0.5019608 ]
[0.69803923 0.6901961 0.6901961 ... 0.5058824 0.49803922 0.49411765]]
[[0.3647059 0.36078432 0.35686275 ... 0.5176471 0.5176471 0.5254902 ]
[0.3647059 0.3529412 0.3529412 ... 0.52156866 0.52156866 0.53333336]
[0.36862746 0.3529412 0.36078432 ... 0.5294118 0.5294118 0.5372549 ]
...
[0.7490196 0.7490196 0.7490196 ... 0.5568628 0.5647059 0.5686275 ]
[0.7411765 0.7411765 0.7411765 ... 0.54901963 0.5568628 0.5647059 ]
[0.7372549 0.7372549 0.7372549 ... 0.5411765 0.5568628 0.56078434]]
[[0.68235296 0.68235296 0.6862745 ... 0.6784314 0.6862745 0.6862745 ]
[0.6784314 0.6901961 0.6901961 ... 0.6862745 0.6862745 0.6901961 ]
[0.68235296 0.69411767 0.6862745 ... 0.6901961 0.6901961 0.69411767]
...
[0.83137256 0.83137256 0.827451 ... 0.69411767 0.69411767 0.6901961 ]
[0.8235294 0.8235294 0.8235294 ... 0.6901961 0.6862745 0.6862745 ]
[0.81960785 0.8235294 0.81960785 ... 0.69411767 0.6862745 0.6862745 ]]

# hier scheitere ich an der Weiterverarbeitung der arrays

2.) Wenn möglich ein Durchschnitt der drei RGB Farbanteile

3.) Wenn ein beliebiger Farbanteil eines Pixels (z.B blau) größer als 1.1 dann wird eine Nachricht "Kategorie: blau_intensiv" angezeigt und erhält den Wert 1 (True)

3.1.) Wenn ein beliebiger Farbanteil eines Pixels (z.B blau) kleiner als 1.1 dann wird eine Nachricht "Kategorie: blau_arm" angezeigt und erhält den Wert 0 (False)

4.) Der Blaugrad zwischen "blau_intensiv" und "blau_arm" sollte mit drin sein
Idee: Zwei Variablen definieren und ins Verhältnis setzen?


Mfg

Xalagy

Re: Prozentuale Anzeige der RGB Werte eines Bildes

Verfasst: Freitag 8. Januar 2021, 07:37
von ThomasL
Hi, Punkt 3 und 3.1 sind etwas seltsam.
Entweder liegen Farbwerte für RGB im Bereich von 0 bis 255 oder zwischen 0 und 1. (ersteres durch 255 geteilt). Deine Beispiele zeigen letzteres.
Dies bedeutet aber, dass ein beliebiger Farbanteil nicht größer als 1.1 sein kann.

Re: Prozentuale Anzeige der RGB Werte eines Bildes

Verfasst: Freitag 8. Januar 2021, 09:08
von einfachTobi

Code: Alles auswählen

print(bild.mean(axis=(0, 1)))
Damit erhältst du die Durchschnittswerte über das gesamte Bild für die einzelnen Farben. Aber das ist wenig aussagekräftig: Ein weißes Bild ist "rot_intensiv", "grün_intensiv" und "blau_intensiv". Zu dem kommt das, was ThomasL schon gesagt hat - mehr als 100 % Anteil sind nicht drin.

Re: Prozentuale Anzeige der RGB Werte eines Bildes

Verfasst: Sonntag 10. Januar 2021, 11:00
von tonikae
Es gibt Rechenformeln für so etwas. Die gehen so:

rot/(r+g+b)
grün/(r+g+b)
blau/(r+g+b)

Codemäßig ist das dann nur eine kleine Erweiterung deines Codes
und kann beispielhaft so aussehen.

Code: Alles auswählen

import matplotlib.pyplot as plt

bild = plt.imread("bild.png") # Bild einlesen
bild_rot = bild[:,:,0] # Die einzelnen Spalten (RGB) als arrays extrahieren
bild_gruen = bild[:,:,1]
bild_blau = bild[:,:,2]

rm=bild_rot.mean()
gm=bild_gruen.mean()
bm=bild_blau.mean()
cols=rm+gm+bm
summe=(rm/cols)+(gm/cols)+(bm/cols)

print(" Rot-Anteil: ",rm/cols)
print("Grün-Anteil: ",gm/cols)
print("Blau-Anteil: ",bm/cols)
print("Anteilsumme: ",summe)
Überprüfen kann man das mit einfarbigen Bildern.Beispiel: Ein rein gelbes Bild muss einen
Rot-Farbanteil und Grün-Anteil von jeweils 0.5 haben....der Blau-Anteil muß 0.0 sein
Abfangen braucht man nur reines schwarz(weil alle Farben=0 ->Division durch Null->mathematisch
nicht zulässig->Fehlermeldung)