我有一个 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++ 模块来完成这项任务。
任何能让我远离这条道路的东西都将不胜感激!