【问题标题】:Transform an image to a bitmap将图像转换为位图
【发布时间】:2017-09-24 02:26:16
【问题描述】:

我正在尝试为字母图像创建位图,但我没有得到想要的结果。我开始使用图像已经有几天了。我试图读取图像,创建一个 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 代表黑色像素。然后,当我将结果保存在文件中时,我可以看到字母格式。

谁能指导我如何得到这个结果?

谢谢。

【问题讨论】:

    标签: python numpy computer-vision scikit-image


    【解决方案1】:

    看看这个:

    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 数组。然后它将它分成 3 个向量,每个通道一个。我使用颜色向量来创建一个灰色向量。之后,它将元素与 128 进行比较,如果低于写入 0(黑色),则为 255。下一步是重塑并保存。

    【讨论】:

    • 这很有帮助。谢谢你。如果我需要将所有位图调整为 32x32 怎么办?我该怎么做?
    • 我想将图像调整为 32x32 或其他分辨率,但不会过度变形并丢失其格式。我想要一个默认分辨率,以便创建这些图像的数据集。
    • 很高兴它成功了。抱歉,我没有这个答案。我自己正在使用 tensorflow,我对 opencv 的经验很少。我不知道这对您是否值得,但我建议您选择一个满足您需求的库,坚持下去,如果遇到问题,请在 stackoverflow 中提问。玩得开心:)
    • 图像是一个二维数组(128、128),表示一个通道(不是RGB)。您可以使用print(ary.shape) 获取数组的形状。这也不是位图图像;我用`print([elem for elem in range(1,255) if elem in ary])检查了它。我用一些文档更新了我的答案。希望对您有所帮助。
    • 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。否则,一个非常好的答案。
    【解决方案2】:

    你可以用枕头

    from PIL import Image
    
    img = Image.open("haha.jpg")
    img = img.tobitmap()
    

    【讨论】:

      【解决方案3】:

      这需要三个步骤。首先将原始图像转换为像素列表。其次将每个像素更改为黑色(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 看起来像这样 ,阈值 30 看起来像这样 ,阈值 10 看起来像这样 ,如果将其调低到 5,则输出开始丢失像素:

      【讨论】:

        【解决方案4】:

        使用 PIL

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-05
          • 2012-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多