Черно-белое изображение в двоичный массив - PullRequest
0 голосов
/ 23 мая 2018

Я хочу преобразовать мое черно-белое изображение (.png) в двоичный массив (черный - 1, белый - 0).Я написал некоторый код, но он не работает.Ошибка говорит: аргумент 2 для map () должен поддерживать итерацию.Вот мой код:

from PIL import Image
from resizeimage import resizeimage
import sys

def threshold(col):
    s = sum(col) 
    return int(s > 255 * 3 // 2)

img = Image.open("filename.png")

ratio = float((img.size[1]) / (img.size[0]))

img = resizeimage.resize_cover(img, [100, int(ratio * 100)])

pixels = img.getdata()
binary = list(map(threshold, img))

array2d = [binary[i * img.size[0] : (i+1) * img.size[0]] for i in range(img.size[1])]
print('\n'.join(''.join(map(str, line)) for line in array2d))

Вот изображение:

example image

1 Ответ

0 голосов
/ 23 мая 2018

Сначала необходимо преобразовать изображение в оттенки серого, поскольку PIL открывает его как RGB.Затем инвертируйте значения 0 и 255.Затем вы можете преобразовать ненулевые значения в 1. Вот один из способов:

from PIL import Image
import numpy as np

img = Image.open('bw_circle.png').convert('L')

np_img = np.array(img)
np_img = ~np_img  # invert B&W
np_img[np_img > 0] = 1

И альтернативный способ использования PIL для инверсии:

from PIL import Image, ImageOps
import numpy as np

img = Image.open('bw_circle.png').convert('L')
img_inverted = ImageOps.invert(img)

np_img = np.array(img_inverted)
np_img[np_img > 0] = 1
...