Python: Konvertiert Bilder von RGB in YDbDr-Farbraum
Versuch, ein Bild aus dem RGB-Farbraum in einen YDbDr-Farbraum gemäß der folgenden Formel zu konvertieren:
Y = 0.299R + 0.587G + 0.114B
Db = -0.45R - 0.883G +1.333B
Dr = -1.333R + 1.116G + 0.217B
Mit dem folgenden Code versuche ich, nur den Y-Kanal anzuzeigen, der ein Graustufenbild sein sollte, aber ich erhalte immer wieder ein Bild in blauer Farbe:
import numpy as np
from PIL import Image
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("./pics/Slike_modela/Test/Proba/1_Color.png")
new_img = []
for row in img:
new_row = []
for pixel in row:
Y = 0.299*pixel[2]+0.587*pixel[1]+0.114*pixel[0]
Db = -0.45*pixel[2]-0.883*pixel[1]+1.333*pixel[0]
Dr = -1.333*pixel[2]+1.116*pixel[1]+0.217*pixel[0]
new_pixel = [Y, Db, Dr]
new_row.append(new_pixel)
new_img.append(new_row)
new_img_arr = np.array(new_img)
new_img_arr_y = new_img_arr.copy()
new_img_arr_y[:,:,1] = 0
new_img_arr_y[:,:,2] = 0
print (new_img_arr_y)
cv2.imshow("y image", new_img_arr_y)
key = cv2.waitKey(0)
Beim Drucken des Ergebnis-Arrays sehe ich korrekte Zahlen gemäß Formel und korrekter Form des Arrays.
Was ist mein Fehler? Wie bekomme ich ein Y-Kanal-Bild, dh ein Graustufenbild?
Antworten
Wenn Sie Bilder mit Python verarbeiten, sollten Sie wirklich Folgendes vermeiden:
Behandeln von Bildern als Listen und Anhängen von Millionen und Abermillionen von Pixeln, von denen jedes ein ganz neues Objekt erstellt und Platz für die Verwaltung benötigt
Verarbeiten von Bildern mit
forSchleifen, die sehr langsam sind
Der bessere Weg, mit beiden umzugehen, ist die Verwendung Numpyoder anderer vektorisierter Codebibliotheken oder -techniken. Deshalb OpenCV , wand, scikit-imageoffen und Griffbilder als Numpy Arrays.
Sie möchten also grundsätzlich ein Punktprodukt der Farbkanäle mit einem Satz von 3 Gewichten erstellen:
import cv2
import numpy as np
# Load image
im = cv2.imread('paddington.png', cv2.IMREAD_COLOR)
# Calculate Y using Numpy "dot()"
Y = np.dot(im[...,:3], [0.114, 0.587, 0.299]).astype(np.uint8)
Das ist es.