我的问题是关于iOs中的图像世界。我的目标是以某种方式计算或获得图像的“对焦”区域。我想知道图像的哪个部分有焦点。你知道有没有办法做到这一点?也许与对比?我经常搜索,但没有找到任何东西。
答案 0 :(得分:0)
您必须将图像划分为合适的区域并计算每个区域的渐变图像。尖锐区域将具有高梯度值,而模糊将具有低梯度值。
我在Python中包含一个示例,但我相信您可以将其转换为您选择的语言。
我已将渐变计算应用于整个图像,但您只需将图像im
替换为窗口。
下面是一个蒙太奇,显示迭代时的模糊效果和每次迭代时的平均梯度值。在该示例中,可以在第一图像处找到最大梯度值,并且该最大梯度值也是最清晰的图像(即,在焦点中)。
import cv2
import matplotlib.pylab as pl
# Load the image
original_image = cv2.imread('lena.jpg')
# Generate the smoothing kernel
kernel = cv2.getGaussianKernel(9,1)
# I played around with this value and found that there was not
# much change after 10 iteration
num_of_iter = 9
# Define containers
average_gradient = []
blurred_imlist = []
blurred_imlist.append(original_image)
# Blur the image iteratively and use the output from the previous iteration as
# input to the next
for i in range(0,num_of_iter):
# Get the blurred image from the previous step
im = blurred_imlist[i]
# Calculate the gradient
sobelx = cv2.Sobel(im,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(im,cv2.CV_64F,0,1,ksize=5)
abs_sobel_x = cv2.convertScaleAbs(sobelx) # converting back to uint8
abs_sobel_y = cv2.convertScaleAbs(sobely)
# Combine the two gradients with equal weight
dst = cv2.addWeighted(abs_sobel_x,0.5,abs_sobel_y,0.5,0)
# Calculate the average gradient for the image
# I convert it to a numpy array for ease of calculation
average_gradient.append(pl.asarray(dst).mean())
# Blur it and this as input to the next iteration
blurred_im = cv2.filter2D(im, -1, kernel)
blurred_imlist.append(blurred_im)
# The index with the maximum gradient value is your in-focus image
infocus_image = pl.argmax(pl.asarray(average_gradient))
print(infocus_image)
0
答案 1 :(得分:0)
锐利主体的离焦图像与模糊主体的对焦图像相同,因此在一般情况下没有算法可以做到这一点。
如果您假设您的对焦区域具有一定量的微对比度,那么您可以简单地找到与其邻居不同的所有像素超过设定的阈值。 (计算像素值减去四个相邻像素的平均值。这称为梯度或拉普拉斯算子的发散。)一些视频记录系统这样做是为了帮助操作员找到焦点。
如果您有一系列具有不同焦距的图像,则可以为每个图像计算上述图像,以找出哪个图像具有最佳焦点。这就是许多小型相机中AF系统的工作原理。