Пиксельные манипуляции с Python возвращают серое изображение вместо инвертированного - PullRequest
0 голосов
/ 19 ноября 2018

Я делаю некоторый прототип кода для проекта. Я использую Подушку, чтобы открыть изображение и другие незначительные вещи, но я хочу инвертировать изображение вручную, используя значения его пикселей. Я использовал два дополнения в надежде перевернуть его. Однако, когда я отображаю окончательное изображение, он представляет собой сплошной серый квадрат вместо инвертированных цветов. Я просто использовал изображение опоссума, 275 пикселей на 183 пикселей. Есть идеи, почему отображается серый блок, а не перевернутое изображение?

#importing Image module

from PIL import Image
import numpy
#sets numpy to print out full array
numpy.set_printoptions(threshold=numpy.inf)


def twos_comp(val, bits):
    """compute the 2's complement of int value val"""
    if (val & (1 << (bits - 1))) != 0: # if sign bit is set e.g., 8bit: 128-255
    val = val - (1 << bits)        # compute negative value
return val


im = Image.open('possum.jpg')
#im.show()

data = numpy.asarray(im)
#print(data)
#print("FINISHED PRINTING")

#print('NOW PRINTING BINARY')
data_binary = numpy.unpackbits(data)
data_binary.ravel()

#print(data_binary)

#print('FINISHED PRINTING')

#getting string of binary array
binaryString = numpy.array2string(data_binary)
binaryString = ''.join(binaryString.split())
binaryString = binaryString[:-1]
binaryString = binaryString[1:]

#print("Binary String: " + binaryString)

out = twos_comp(int(binaryString,2), len(binaryString))

#print('Now printing twos:')
#print(out)


#formatting non-binary two's comp as binary
outBinary = "{0:b}".format(out)
#print('Now printing binary twos: ' + outBinary)


outBinary = outBinary.encode('utf-8')

a_pil_image = Image.frombytes('RGB', (275, 183), outBinary)

a_pil_image.show()

1 Ответ

0 голосов
/ 19 ноября 2018

Вы можете инвертировать с помощью PIL / Pillow:

from PIL import Image, ImageChops

# Load image from disk and ensure RGB
im = Image.open('lena.png').convert('RGB')

# Invert image and save to disk
res = ImageChops.invert(im)
res.save('result.png')

Превращает Лену в отрицанную Лену:

enter image description here


Или, если вы хотите быть более математичным в этом вопросе:

from PIL import Image                                                                       
import numpy as np                                                                          

im = Image.open('lena.png').convert('RGB')                                                    

# Make Numpy array
imnp = np.array(im)                                                                         
# Invert
imnp = 255 - imnp                                                                           
# Save
Image.fromarray(imnp).save('result.png') 

Если вы представите, что черное изображение представлено (0,0,0), а белое изображение (255,255,255), надеюсь, нетрудно понять, что инверсия цветов достигается вычитанием из 255, а не использованием дополнения до двух. .

...