我有一张RGBA图像需要放大,同时保持平滑。但是问题在于我需要保持颜色完全不变(背景:我正在调整一个地图的大小,其中各个省份的颜色已经编码),所以我不能仅使用双三次插值进行调整大小,因为这也会插值像素颜色并使其平滑。因此,为了获得平滑的边缘,我希望使用最近邻居法进行放大(给我阶梯状图案),然后通过用目标图像中半径内出现最多的像素颜色替换每个像素来修整边缘,如下所示:
这很快就完成了,但不起作用,因为PIL的ImageFilters在每个通道上单独操作。我试图采用numpy数组并在循环中执行以下操作:
请注意,这里的目标(dest)和源(source)都是形状为XxYx4的数组,因此需要进行必要的重塑和转换为元组。
理论上来说,这种方法可以奏效,但对于我正在处理的8200万像素图像,需要12小时才能完成。 我推断这主要是由于强制类型转换和重塑造成的不必要开销。
在Python中如何适当地做到这一点呢?
我已经准备好放弃并编写一个C++模块来完成这个任务了。任何能让我远离这条路的建议都将不胜感激!
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++模块来完成这个任务了。任何能让我远离这条路的建议都将不胜感激!