【问题标题】:Smooth Text Borders平滑文本边框
【发布时间】:2020-04-16 16:31:56
【问题描述】:

我有下面的图片:

我想平滑它的边界但不删除曲线。我希望它看起来像第二张图片一样自然。我应该如何在 Python 中做到这一点?

代码:

 from PIL import Image
 import numpy as np

 image_counter = 1
 path = 'sample/' + str(image_counter) + '.png'
 image = Image.open(path).convert('1')
 image = np.array(image)

 #Image manipulation goes here.



 image = Image.fromarray(image)
 image.save('output.png')  

如果有将曲线近似为线的算法(例如 Douglas Peucker 算法),我希望它反过来。我想要一种将锯齿状线条平滑成曲线的算法。这可能吗?

【问题讨论】:

  • 通过代码读取文本并将相同的字符串输出到图像是否满足您的需求?
  • @zabop 是的,字符串应该是一样的。我只是想使用图像处理技术模仿真实的扫描旧图像。
  • @zabop 请看我更新的帖子。

标签: python python-3.x image image-processing


【解决方案1】:

以下我认为应该有效: 对图像进行 2D FFT,去除高频分量,这些分量会导致边界上的摆动位,将其逆变换回来,得到一个平滑的图像。

下面是一个没有给出预期结果但可能有用的实现。


在您的#Image manipulation goes here 行之后:

imagefft=np.fft.fft2(图像)

使用此函数消除高频位,将高于 85 个百分位值的值清零:

def smoothen(this):
    return this * (np.percentile(this, 85) > this)

smoothen 函数应用于二维傅里叶逆变换的绝对值,并将结果数组转换回:

imageres = (np.real(np.fft.ifft2(smoothen(np.real(imagefft)+np.imag(imagefft))))-
            np.imag(np.fft.ifft2(smoothen(np.real(imagefft)+np.imag(imagefft)))))

使用plt.imshow(imageres) 我们得到:

增加对比度:

tminval = np.percentile(imageres, 10)
maxval = np.percentile(imageres, 90)
pixvals = np.clip(imageres, minval, maxval)
pixvals = ((pixvals - minval) / (maxval - minval)) * 255

plt.imshow(pixvals)检查结果:

这显然行不通。

我把这个答案留在这里是因为实施是公认的错误,我相信理论是正确的,所以无论如何它可能有用。随意编辑。

【讨论】:

  • 谢谢你给我一个想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多