获取图像的聚焦像素

3

如何检测图像中哪些像素对比模糊的像素处于聚焦状态。类似于许多相机具有的“对焦峰值”功能?

这个想法是将处于聚焦状态的像素着色,以便在用户拍照时辅助使用。寻找通过Python实现的方法。

1个回答

5
你可以找到边缘,这些边缘通常很锐利或者对比度很高,并将它们叠加到原始图像上。
所以,从这张图片开始: enter image description here 来源:Rita Kochmarjova - Fotolia
你可以做如下操作:
#!/usr/bin/env python3

import numpy as np
from PIL import Image, ImageFilter, ImageChops

# Open input image and make greyscale copy
image = Image.open('bulldog.jpg')
grey  = image.copy().convert('L')

# Find the edges
edges = grey.filter(ImageFilter.FIND_EDGES)
edges.save('edges.png')

# Draw the sharp edges in white over original
RGBedges = Image.merge('RGB',(edges,edges,edges))
image.paste(RGBedges, mask=edges)

# Save
image.save('result.png')

enter image description here

你可以在水边的石头上最清晰地看到效果。
这里是中间的 edges.png。你可以稍微膨胀白色像素,或者进行阈值处理,使得对焦部分更加清晰。

enter image description here


这是边缘膨胀后的效果,以使其更加明显:

#!/usr/bin/env python3

import numpy as np
from PIL import Image, ImageFilter
from skimage.morphology import dilation, square

# Open input image and make greyscale copy
image = Image.open('bulldog.jpg')
grey  = image.copy().convert('L')

# Find the edges
edges = grey.filter(ImageFilter.FIND_EDGES)

# Define a structuring element for dilation
selem = square(3)
fatedges = dilation(np.array(edges),selem)
fatedges = Image.fromarray(fatedges)
fatedges.save('edges.png')

# Draw the sharp edges in white over original
RGBedges = Image.merge('RGB',(fatedges,fatedges,fatedges))
image.paste(RGBedges, mask=fatedges)

# Save
image.save('result.png')

enter image description here


您也可以在终端中使用ImageMagick而无需编写任何代码:

magick bulldog.jpg \( +clone -canny 0x1+10%+30% \) -compose overlay -composite  result.png

enter image description here

或者这个,更类似于Python:
magick bulldog.jpg \( +clone -canny 0x1+10%+30% \) -compose lighten -composite  result.png

enter image description here


有没有办法在PIL模块中调整边缘检测的参数?或者我应该使用其他方法来查找边缘? - stepovr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接