3

我有一个 RGBA 图像,我需要在保持平滑的同时进行升级。

问题是我需要保持颜色完全一样(背景:我正在调整地图的大小,其中省份是颜色编码的),所以我不能只使用双三次插值来调整大小,因为这也会插值平滑时的像素颜色。

因此,为了获得平滑的边缘,我希望使用最近邻(给我楼梯图案)进行升级,然后通过用在某个半径内最常出现的像素颜色替换目标图像中的每个像素来修整边缘,a所以:

from PIL import Image, ImageFilter
amount=3
image=Image.open(<file>)
image=image.filter(ImageFilter.ModeFilter(amount))

这很快就完成了,除了它不起作用,因为 PIL 的 ImageFilters 在每个通道上单独运行。握拳

我尝试使用 numpy 数组并在循环中执行以下操作:

dest[x,y]=Counter([tuple(e) for e in reshape(source[max(x-r,0):x+r+1,max(y-r,0):y+r+1],(-1,4))]).most_common()[0][0]

请注意,此处的 dest 和 source 是相同形状的 XxYx4 数组,因此需要重新整形并转换为元组。
理论上这会起作用,但要完成我正在操作的8200 万像素图像需要 12 个小时。我推断这主要是由于铸造和重塑的不必要开销。

在 Python 中执行此操作的合适方法是什么?

我正准备举手并编写一个 C++ 模块来完成这项任务。
任何能让我远离这条道路的东西都将不胜感激!

4

2 回答 2

1

如果您关心图像中的一组固定颜色,“调色板”图像模式可能更合适(至少,如果您的地图中没有超过 256 种颜色)。

我建议首先将您的图像转换为“P”模式(由于我对 PIL 不太熟悉,我不确定这有多容易。也许您必须先明确地构建调色板?)和然后应用模式过滤器。

我想到的另一个解决方案是在升迁时简单地使用双三次插值,然后使用从原始图像派生的调色板转换为调色板图像。与您当前的方法相比,这可能会产生更好的结果(并且更容易实施)。

于 2012-02-10T08:48:00.320 回答
-1

Image_scaling中描述的 EPX没有引入新的颜色。Scale 2x 这样做:

  A    --\ 1 2
C P B  --/ 3 4
  D 

IF C==A => 1=A
IF A==B => 2=B
...

并且在那里也描述了比例 3x。
除此之外,我同意“直接进入 C”——取决于你所知道的。有人用过np_inline吗?

于 2012-02-13T17:15:04.740 回答