Получить в фокусе пикселей изображения - PullRequest
2 голосов
/ 26 марта 2020

Как определить, какие пиксели изображения находятся в фокусе по сравнению с размытыми. Что-то вроде функции «Пик фокусировки», которую имеют многие камеры?

Идея состоит в том, чтобы раскрасить пиксели, которые находятся в фокусе, чтобы помочь пользователю при нажатии на изображение. Ищем реализацию через Python.

1 Ответ

1 голос
/ 26 марта 2020

Вы можете найти края, которые являются резкими или контрастными, а затем наложить их на исходное изображение.

Итак, начиная с этого изображения:

enter image description here Credit: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...