将图像转换为位图

7

我正在尝试创建一张字母图像的位图,但是我没有得到预期的结果。我已经开始使用图像工作了几天。我试图读取图像,创建一个numpy数组并将内容保存到文件中。我编写了下面的代码:

import numpy as np
from skimage import io
from skimage.transform import resize

image = io.imread(image_path, as_grey=True)
image = resize(image, (28, 28), mode='nearest')
array = np.array(image)
np.savetxt("file.txt", array, fmt="%d")

我试图像下面这个链接中的图片一样使用图片: Letter "e" 我尝试创建一个由0和1组成的数组,其中0表示白色像素,1表示黑色像素。然后当我将结果保存在文件中时,我可以看到字母格式。
有人可以指导我如何获得这个结果吗?
谢谢。
4个回答

15

看看这个:

from PIL import Image
import numpy as np

img = Image.open('road.jpg')
ary = np.array(img)

# Split the three channels
r,g,b = np.split(ary,3,axis=2)
r=r.reshape(-1)
g=r.reshape(-1)
b=r.reshape(-1)

# Standard RGB to grayscale 
bitmap = list(map(lambda x: 0.299*x[0]+0.587*x[1]+0.114*x[2], 
zip(r,g,b)))
bitmap = np.array(bitmap).reshape([ary.shape[0], ary.shape[1]])
bitmap = np.dot((bitmap > 128).astype(float),255)
im = Image.fromarray(bitmap.astype(np.uint8))
im.save('road.bmp')
程序接收一张RGB图像并将其转换为NumPy数组。然后将其分成三个向量,每个通道一个。使用颜色向量创建灰度向量。然后将元素与128进行比较,如果低于则写入0(黑色),否则为255。下一步是重新调整形状并保存。 road.jpg road.bmp

太好了,它起作用了。抱歉,我没有这个答案。我自己在使用tensorflow,对opencv的经验很少。我不知道你是否值得去尝试,但我建议你选择一个可以满足你需求的库,并坚持使用它。如果你遇到问题,可以在stackoverflow上提问。祝愉快 :) - prometeu
只有一个问题。我尝试使用相同的代码来处理图片https://imgur.com/nSz1Lxd,但它没有运行成功。我收到了有关轴的错误信息。 - Leonardo Burrone
1
该图像是一个二维数组(128, 128),表示只有一个通道(不是RGB)。您可以使用print(ary.shape)获取数组的形状。这也不是位图图像;我用print([elem for elem in range(1,255) if elem in ary])进行了检查。我更新了我的答案并添加了一些文档。希望能有所帮助。 - prometeu
我只是忽略了R、G、B的分离,然后像这样重写了它:https://imgur.com/PyTsZWf。我调整了图像的大小,最后将结果保存在一个具有字母格式的txt文件中。所以,如果我想要创建位图图像,我只需要先验证它是否为RGB图像?你能告诉我用于乘以lambda的数字是什么吗? - Leonardo Burrone
2
list(map(lambda x: 0.299*x[0]+0.587*x[1]+0.114*x[2], zip(r,g,b))) 在numpy中可以更快地完成。只需使用 0.299 * r + 0.587 * g + 0.114 * b 即可。否则,这是一个非常好的答案。 - zvone
显示剩余3条评论

6

你可以使用pillow

from PIL import Image

img = Image.open("haha.jpg")
img = img.tobitmap()

1

需要三个步骤来完成。首先将原始图像转换为像素列表。其次,将每个像素更改为黑色(0,0,0)或白色(255,255,255)。第三步将列表转换回图像并保存。

代码:

from PIL import Image

threshold = 10

# convert image to a list of pixels
img = Image.open('letter.jpg')
pixels = list(img.getdata())

# convert data list to contain only black or white
newPixels = []
for pixel in pixels:
    # if looks like black, convert to black
    if pixel[0] <= threshold:
        newPixel = (0, 0, 0)
    # if looks like white, convert to white
    else:
        newPixel = (255, 255, 255)
    newPixels.append(newPixel)

# create a image and put data into it
newImg = Image.new(img.mode, img.size)
newImg.putdata(newPixels)
newImg.save('new-letter.jpg')

threshold 是决定像素变为黑色或白色的参数,你可以在代码中看到它。阈值为50的效果长这样 enter image description here,阈值为30的效果长这样enter image description here,阈值为10的效果长这样enter image description here,如果你将阈值降低到5,输出结果会丢失像素:enter image description here


-1

使用PIL

from PIL import Image
Image.open("sample1.png").save("sample1.bmp")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接