gpt4 book ai didi

python - Python 中的图像锐化错误

转载 作者:行者123 更新时间:2023-11-28 21:39:02 25 4
gpt4 key购买 nike

from PIL import Image
fp="C:\\lena.jpg"
img=Image.open(fp)
w,h=img.size
pixels=img.load()

imgsharp=Image.new(img.mode,img.size,color=0)
sharp=[0,-1,0,-1,8,-1,0,-1,0]

for i in range(w):
for j in range(h):

for k in range(3):
for m in range(3):
l=pixels[i-k+1,j-m+1]*sharp[i]

if l>255:
l=255
elif l<0:
l=0
imgsharp.putpixel((i,j),l)

imgsharp.show()

我想对灰度图像应用 3x3 蒙版大小的高通(锐化)滤镜。但是我收到一个错误:

Traceback (most recent call last):
File "C:\sharp.py", line 16, in <module>
l=pixels[i-k+1,j-m+1]*sharp[i]
IndexError: image index out of range

如何修正我的错误以及如何让图像锐化在这段代码中起作用?

最佳答案

你提到的具体错误是因为你没有处理图像的边界。一个解决方案是 pad the image或处理宽度和高度限制。例如:将i-k+1j-m+1替换为max(0, min(w, i-k+1))max(0, min(h, j-m+1))) 分别。

您的代码还有其他问题:

  • 您正在访问的过滤器元素不正确...您可能是指 sharp[3*m+k] 您在其中编写了 sharp[i]
  • 您使用的是彩色图像还是灰度图像?对于彩色图像,l 有 3 个维度,不能直接与单个数字(0 或 255)进行比较。
  • 此外,l 值的裁剪和 putpixel 调用应该在最内层循环内。
  • 你的内核看起来有点奇怪。那8应该是5吗?或者 9 和 0 变成 -1?看看kernelsthis example .
  • 这种带有多个嵌套循环的实现方式效率不高。

我推荐以下解决方案来解决您的问题。

如果你想锐化图像仅此而已,你可以使用PIL.Image.filter:

from PIL import Image, ImageFilter


img = Image.open('lena.png')
img_sharp = img.filter(ImageFilter.SHARPEN)
img_sharp.show()

如果您确实想要指定内核,请使用 scipy 尝试以下操作。一定要看看convolve documentation .

from PIL import Image

from scipy import ndimage, misc
import numpy as np


img = misc.imread('lena.png').astype(np.float) # read as float
kernel = np.array([0, -1, 0, -1, 5, -1, 0, -1, 0]).reshape((3, 3, 1))

# here we do the convolution with the kernel
imgsharp = ndimage.convolve(img, kernel, mode='nearest')
# then we clip (0 to 255) and convert to unsigned int
imgsharp = np.clip(imgsharp, 0, 255).astype(np.uint8)

Image.fromarray(imgsharp).show() # display

另一种方法是使用 OpenCV。看看this article .它将澄清许多实现细节。

关于python - Python 中的图像锐化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47377230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com