Prozentuale Anzeige der RGB Werte eines Bildes

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Xalagy
User
Beiträge: 1
Registriert: Donnerstag 7. Januar 2021, 19:43

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
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

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.
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

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