Ich versuche, ein 1-Layer-Bild (Graustufenbild) in ein 3-Layer-RGB-Bild zu konvertieren. Unten ist der Code, den ich benutze. Dies läuft fehlerfrei, führt jedoch nicht zum richtigen Ergebnis.

from PIL import Image  # used for loading images

def convertLToRgb(img):
    height = img.size[1]
    width = img.size[0]
    size = img.size
    mode = 'RGB'
    data = np.zeros((height, width, 3))
    for i in range(height):
        for j in range(width):
            pixel = img.getpixel((j, i))
            data[i][j][0] = pixel
            data[i][j][1] = pixel
            data[i][j][2] = pixel
    img = Image.frombuffer(mode, size, data)
    return img

Was mache ich hier falsch? Ich erwarte kein Farbbild, aber ich erwarte ein Schwarzweißbild, das der Eingabe ähnelt. Unten sind die Eingabe- und Ausgabebilder:

enter image description here enter image description here

1
Paul Reiners 18 Jän. 2019 im 01:28

3 Antworten

Beste Antwort

Ändern Sie abhängig von der Bittiefe Ihres Bildes:

data = np.zeros((height, width, 3))

Zu:

data = np.zeros((height, width, 3), dtype=np.uint8)

Für ein 8-Bit-Image müssen Sie Ihren Numpy-Array-Typ auf eine vorzeichenlose 8-Bit-Ganzzahl zwingen, andernfalls wird standardmäßig float64 verwendet. Verwenden Sie für 16-Bit np.uint16 usw.

1
Steven 17 Jän. 2019 im 23:32

Was ist deine Aufgabe? Schwarz-Weiß-Bild oder RGB-Farbbild. Wenn Sie das graue Bild in das schwarz-weiße Bild konvertieren möchten. Sie können das Bild direkt in ein Binärbild konvertieren. Was Ihren Code betrifft, müssen Sie zwei Dinge beachten. Erstens ist die Position des Pixels richtig, die falsche Position macht das Bild schwarz wie Ihr Beitrag. Zweitens können Sie das RGB nur direkt in ein Graustufenbild konvertieren, aber Sie können das Graustufenbild nicht direkt in ein RGB-Bild konvertieren, da es möglicherweise nicht genau ist.

0
Xxs 17 Jän. 2019 im 22:59

Sie können dies mit PIL.Image und PIL.ImageOps tun, wie unten gezeigt. Aufgrund der Art und Weise, wie es geschrieben ist, muss das Quellbild nicht aus einer Ebene bestehen. Bei Bedarf wird es vor der Verwendung in eine Ebene konvertiert:

from PIL import Image
from PIL.ImageOps import grayscale

def convertLToRgb(src):
    src.load()   
    band = src if Image.getmodebands(src.mode) == 1 else grayscale(src)
    return Image.merge('RGB', (band, band, band))

src = 'whale_tail.png'
bw_img = Image.open(src)
rgb_img = convertLToRgb(bw_img)
rgb_img.show()
0
martineau 18 Jän. 2019 im 13:59