【问题标题】:Convert an image to use less colors转换图像以使用更少的颜色
【发布时间】:2019-09-19 23:39:41
【问题描述】:

我正在执行图像分割任务。我正在将图像转换为标签,但图像的问题是由于 jpg 压缩的人工制品,图像中存在中间颜色。因此,对于应该有 4 种颜色的图像(就我而言),它们有多种颜色。例如,下面的图像中存在 338 种颜色 -

我使用以下代码进行了检查-

image = Image.open("Image_Path")
image = np.array(image)
target = torch.from_numpy(image)
h,w = target.shape[0],target.shape[1]
masks = torch.empty(h, w, dtype=torch.long)
colors = torch.unique(target.view(-1,target.size(2)),dim=0).numpy()

为了解决这个问题,我尝试了this 方法,但问题是它将图像转换为非预先确定的像素值。它将上面的图像转换为以下像素值-

array([[  0,   0,   0],
   [  0,   0, 254],
   [  0, 254,   0],
   [254,   0,   0]]

这对我来说有点问题,因为我有不同的图像,并且每个图像的每种颜色都需要相同的像素值,但是使用上述方法,其他图像不一样,它可能会将红色图像转换为[255,0,0] 或类似的其他颜色。 怎么做?

【问题讨论】:

  • 不要使用 JPEG 来存储这样的图像。使用索引格式,您的图像基本上可以仅使用每像素 2 位来保存。但即使作为标准的全彩 PNG 文件,它也能非常有效地保存,而且不会出现伪像。
  • 问题是图像已经存储,我收到了这个数据集,我必须对其执行操作。问题是我也在观察 png 图像中的伪影效果,所以我有点被它们打动了
  • 如果您在 PNG 图像中观察到伪影,这意味着有人拍摄了 JPEG 图像并对其进行了转换。无论是谁向您发送了图像,都应该被告知向您发送正确的数据,而不是带有易于避免的人工伪影的数据。当然你可以绕过它,但这样做是在浪费你的时间,因为其他人不知道他们在做什么,也没有人敢向他们解释如何做他们的工作。
  • @CrisLuengo 我完全同意。这是一种学术数据集,学者们通常只关心发表而不考虑长期目标。

标签: python image image-processing computer-vision


【解决方案1】:

approach you already tried 开始(从此处复制该答案的代码以供参考,修改为阅读 OP 的图像):

import numpy as np
from skimage import io
from sklearn.cluster import KMeans

original = io.imread('https://i.stack.imgur.com/9XMfw.png')
original = original[:,:,0:3]  # remove alpha channel
n_colors = 4

arr = original.reshape((-1, 3))
kmeans = KMeans(n_clusters=n_colors, random_state=42).fit(arr)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
less_colors = centers[labels].reshape(original.shape).astype('uint8')

io.imshow(less_colors)

目标是让centers 在图像之间保持一致。我们可以通过强制此数组中的每个元素为 0 或 255 来做到这一点。此选择仅在输入图像都具有在此更改后可区分的相似颜色时才有效。假设它们都具有在问题中发布的一张图片中使用的相同 4 种颜色,这应该不是问题。

实现此目的的一种简单方法是将值除以 255,四舍五入,然后再次乘以 255:

centers = np.round(centers/255)*255

这行代码会在创建less_colors之前出现。

【讨论】:

  • 我用了这个之后颜色的数量增加了。现在,我有 83392 种颜色。
  • 您是否在我编写代码时复制粘贴了代码? np.round 语句在 centers = kmenas.cluster_centers_ 之后。我得到了 4 种颜色,但我看不出怎么可能得到其他数量的颜色。
  • 对不起,我是个白痴,我在旧文件上测试代码。非常感谢。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2016-07-10
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多