【发布时间】:2020-06-02 03:07:20
【问题描述】:
我有一张颜色不一的城市图像(绿色=草地,黑色=建筑物,白色/黄色=道路)。使用 Pillow,我在我的 (Python) 程序中导入图片并将其转换为具有离散颜色值的 Numpy 数组(即绿色像素变为 1,黑色像素变为 2,等等)。
我想降低图像的分辨率(用于计算目的),同时保留尽可能多的信息。但是,使用 Pillow 的 resize() 方法,颜色会偏离这些离散值。如何在(最重要的是)保留离散颜色和(也很重要)尽可能少丢失信息的同时缩小该图像的比例?
这里是图片示例:https://i.imgur.com/6Tef55H.png
编辑:根据请求,一些代码:
from PIL import Image
import Numpy as np
picture = Image.open(some_image.png)
width, height = picture.size
pic_array = np.zeros(width,height)
# Turn the image into discrete values
for i in range(0,width):
for j in range(0,height):
red, green, blue = picture.getpixel((i,j))
if red == a and green == b and blue == c:
#An example of how discrete colors are converted to values
pic_array[i][j] = 1
可以通过两种方式进行缩放:
1) 使用 Pillow 的调整大小库缩放原始图像或 2)使用类似的东西重新调整最终数组:
scaled_array = pic_array[0:width:5, 0:height,5]
选项 1 在保留信息方面“很好”,但会丢失离散值,而选项 2 则相反。
【问题讨论】:
-
PIL/Pillow 的
resize()方法采用可选的filter参数 - 值NEAREST应该达到不引入新颜色的预期结果。 -
你能给我们代码吗?
-
感谢@jasonharper - 这确实解决了我的第一个目标(保留离散颜色),但我感觉很多信息都以这种方式丢失了。也许我应该改写我的问题:我可以在保留离散值的同时使用其中一种奇特的算法吗?
-
所有花哨的算法都是通过生成最能代表原始图像中像素区域的新颜色来工作的。我能想到的一种算法在你的情况下会更好:查看所有将减少为单个新像素的源像素,并从中选择 最常见的离散颜色其中。但这不是内置算法之一,我怀疑它会很慢。
-
您的要求相互矛盾。您不能既保留准确的颜色又防止丢失信息。
标签: python python-imaging-library