【问题标题】:B&W image to binary array黑白图像到二进制数组
【发布时间】:2018-11-02 19:22:47
【问题描述】:

我想将我的黑白图像(.png)转换为二进制数组(黑色为 1 白色为 0)。我已经写了一些代码,但它不工作。错误说:map() 的参数 2 必须支持迭代。 这是我的代码:

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))

图片如下:

【问题讨论】:

  • 实际上是黑白的还是有灰色的?
  • 不只是黑白,图像只是我用颜料画了一个黑色圆圈,白色背景。
  • binary = list(map(threshold, pixels))替换binary = list(map(threshold, img))
  • 仍然,我得到一个空列表
  • np_img = np.array(img) 转换成NumPy 数组怎么样,然后将非零值设置为1 np_img[np_img > 0] = 1

标签: python image binary converter


【解决方案1】:

您需要先将图像转换为灰度,因为 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

【讨论】:

  • 我打印了 np_img [[1 1 1 ..., 1 1 1] [1 1 1 ..., 1 1 1] [1 1 1 ..., 1 1 1] .. ., [1 1 1 ..., 1 1 1] [1 1 1 ..., 1 1 1] [1 1 1 ..., 1 1 1]]
  • 实例 1 我需要打印 0 。 0 到 1 相同。如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 2017-07-19
  • 2021-02-20
  • 2011-08-20
  • 2013-12-17
  • 1970-01-01
  • 2017-11-13
  • 2011-03-17
  • 2014-01-29
相关资源
最近更新 更多