Как превратить картинку в черно-белый - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь преобразовать некоторые из моих фотографий в черно-белые. Пока у меня есть это

import image 

def black_and_white(pic): 

    for y in range(pic.getHeight()): 
        for x in range(pic.getWidth()): 
            p = pic.getPixel(x,y) 

            r = p.getRed() 
            g = p.getGreen()
            b = p.getBlue()

            if x > 0.128:
                x = .255 * r + .255 * g +.255 * b
            else: 
                x = .0 * r + .0 * g +.0 * b

            x = int(x) ## to convert it to an integer 
            newp = image.Pixel(x, x, x) ## to convert to a new pixel 
            pic.setPixel(x, y, newp) 
    return pic 

def main(): 

    bell = image.Image("luther.jpg") 

    width = bell.getWidth() 

    height = bell.getHeight()

    win = image.ImageWin(width, height) 

    bell.draw(win) 

    gs_bell = grayscale(bell)

    gs_bell.draw(win) 


main() ## starts execution 

Если бы кто-нибудь мог дать мне совет, я был бы очень признателен!

Мне очень жаль за отсутствие ясности. Вот изображение, которое я получаю. введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Вот полный рабочий пример с использованием PIL (потому что я не знаю, откуда исходит ваш import image, вы не сказали).

import sys
import argparse
import PIL.Image # https://pillow.readthedocs.io/en/3.1.x/reference/Image.html
import os

def black_and_white(pic): 
    for y in range(pic.size[1]): 
        for x in range(pic.size[0]): 
            r, g, b = pic.getpixel((x, y)) 

            v = 0.2989 * r + 0.5870 * g + 0.1140 * b
            if v > 128.0:
                v = 255
            else: 
                v = 0

            v = int(v) ## to convert it to an integer 
            pic.putpixel((x, y), (v, v, v)) 


def main(options):
    try:
        image = PIL.Image.open(options.filename)
    except:
        print('ERROR: Could not open %s' % (options.filename))
    else:
        black_and_white(image)
        basename = os.path.splitext(options.filename)[0]
        image.save(basename + '_solution' + '.jpg', 'JPEG')

    return 0 

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'filename',
        help='Image file.')
    options = parser.parse_args()
    sys.exit(main(options))

This у меня работает: enter image description here

0 голосов
/ 09 апреля 2020

Ваш код содержит множество ошибок. Вы используете x в качестве значения пикселя, когда это фактически пиксельная координата.

Я бы изменил это:

            if x > 0.128:
                x = .255 * r + .255 * g +.255 * b
            else: 
                x = .0 * r + .0 * g +.0 * b

            x = int(x) ## to convert it to an integer 
            newp = image.Pixel(x, x, x) ## to convert to a new pixel

на это:

            v = 0.2989 * r + 0.5870 * g + 0.1140 * b
            if v > 128.0:
                v = 255
            else: 
                v = 0

            v = int(v) ## to convert it to an integer 
            newp = image.Pixel(v, v, v) ## to convert to a new pixel

Весовые значения RGB взяты из этой статьи .

...