![]() pip install opencv-python numpy scikit-image ![]() Local Variance 方法测量局部强度变化,假设与模糊图像相比,清晰图像表现出更高的对比度和方差。它计算邻域内像素强度的方差,使其可用于检测图像中的焦点。 ![]() 优点: 简单快速 – 计算效率高且易于实施。 对高对比度图像有效 – 当图像具有较强的边缘和强度变化时,效果很好。 噪声稳健性(在一定程度上) – 与基于梯度的方法相比,受像素强度微小变化的影响较小。 缺点: 在低对比度图像上失败 – 如果图像具有均匀的强度(例如,模糊但亮度高),则可能会错误地分配高分。 对照明变化敏感 – 不均匀的照明会影响变化,从而导致清晰度评估不准确。 不是自动对焦的最佳选择 – 与基于渐变的方法相比,性能不一致。 2. 基于熵的焦点测量 基于熵的焦点测量通过分析强度值的分布来量化图像清晰度。清晰的图像包含更详细的信息并具有较高的熵值,而模糊的图像往往具有更均匀的强度分布和较低的熵。 ![]() 优点: 适用于纹理丰富的图像 – 最适合具有大量详细纹理和图案的图像。 耐少量噪点 – 仍然可以在轻微噪点的图像中提供可靠的结果。 适用于低对比度情况 – 当对比度较低时,性能优于基于方差的方法。 缺点: 计算成本高 – 需要直方图计算和对数计算,因此比方差或梯度方法慢。 对高频区域中的噪声敏感 – 如果图像的噪声过多,则由于随机性增加,熵可能会错误地将其识别为“清晰”。 不适用于基于边缘的清晰度检测 – 在清晰度主要由边缘而不是纹理定义的图像中效果不佳。 3. Tenengrad(基于 Sobel 梯度)焦点测量 Tenengrad 方法根据边缘强度评估图像清晰度。它依赖于 Sobel 算子,该算子可以检测水平和垂直方向的强度变化。假设是更清晰的图像包含更强的边缘,从而导致更高的渐变值。 ![]() 优点: 强边缘检测 – 适用于具有强边缘的图像中的锐度检测。 耐照明变化 – 与基于方差的方法相比,更稳健。 适用于自动对焦应用 – 常用于自动对焦系统,因为它可以有效地检测急剧过渡。 缺点: 对噪声敏感 – 微小的噪声变化会产生强烈的梯度,从而导致错误的锐化检测。 在纹理丰富的低边缘图像中失败 – 如果图像非常详细但缺乏清晰的边缘,该方法可能会低估清晰度。 方向灵敏度 – 如果图像中的结构与渐变方向对齐,则可能会产生误导性结果。 4. Brenner 梯度焦点测量 Brenner 渐变方法根据相邻像素之间的像素强度差异来评估图像清晰度。假设更清晰的图像具有更大的强度变化,从而导致更高的焦点分数。 ![]() 优点: 非常简单快捷 – 比 Sobel 或 Laplacian 方法更快,因为它只使用像素级差异。 对基于边缘的锐度有效 – 适用于检测像素强度的急剧变化。 适用于散焦图像 – 在模糊图像中,性能优于基于变化的方法。 缺点: 不是很可靠 – 在低对比度或纹理丰富的图像中可能不可靠。 对噪声敏感 – 可能会错误地将噪声模式归类为尖锐特征。 在一般应用程序中的有限使用 – 适用于特定的自动对焦场景,但不适用于所有类型的图像。 5. Sobel + 方差组合 此方法通过结合两种方法增强焦点测量: Sobel Gradient (索贝尔梯度) – 通过计算水平和垂直方向的强度变化来测量图像中的边缘强度。 Local Intensity Variance (局部强度方差) – 通过分析像素强度的变化来确定清晰度,假设更清晰的图像具有更高的对比度和方差。 通过结合这两种测量方法,这种方法提供了更稳健的焦点评估,同时捕获了边缘清晰度和局部强度变化。 ![]() 优点: 平衡边缘和强度信息 – 比单独使用 Sobel 或方差更强大。 处理基于边缘和基于纹理的清晰度 – 对各种类型的图像有效。 在自动对焦应用中更可靠 – 减少由于噪声引起的误分类。 缺点: Computationally More Expensive (计算成本更高) – 由于多次计算,速度略慢。 仍然对噪声有些敏感 – 虽然它比单独的方法更强大,但它在处理极度嘈杂的图像时可能仍然难以理解。 需要适当的参数调整 – 性能取决于选择合适的 Sobel 内核大小和方差阈值。 6. 基于 Laplacian 的方法 此方法使用 Laplacian 算子(二阶导数滤波器)来检测图像中的边缘。它测量拉普拉斯响应的方差,假设更清晰的图像具有更强的边缘响应和更高的方差,而模糊的图像具有更平滑的过渡和较低的方差。 ![]() 优点: 捕捉高频清晰度 – 更强地检测精细细节和细微边缘。 适用于一般自动对焦应用 – 用于许多图像处理和显微镜自动对焦系统。 受全局光照变化的影响较小 – 与基于变化的方法相比,在不同的光照条件下更稳定。 缺点: 对噪声非常敏感 – 与基于 Sobel 的方法相比,更容易放大噪声。 计算成本高 – 比更简单的运算符(如方差或 Brenner 梯度)略慢。 边缘过度加重会导致误报 – 如果边缘对比度过高(例如,由于噪声或伪影),可能会错误地将图像归类为“清晰”。 自动对焦算法代码实现
# Function to compute Local Variance focus measure def compute_local_variance(image, ksize=5): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) mean = cv2.blur(gray, (ksize, ksize)) squared_mean = cv2.blur(gray**2, (ksize, ksize)) variance = squared_mean - (mean**2) return np.mean(variance) 2. 基于熵的焦点测量
3. Tenengrad(基于 Sobel 梯度)焦点测量 def compute_tenengrad(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Convert to grayscale sobel_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) # Sobel filter in X direction sobel_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # Sobel filter in Y direction tenengrad = np.sqrt(sobel_x**2 + sobel_y**2) # Compute gradient magnitude return np.mean(tenengrad) # Return mean gradient magnitude as focus score 4. Brenner 梯度焦点测量
5. Sobel + 方差组合 def compute_sobel_variance(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Convert to grayscale sobel_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) # Sobel X gradient sobel_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # Sobel Y gradient sobel_magnitude = np.sqrt(sobel_x**2 + sobel_y**2) # Compute gradient magnitude variance = np.var(gray) # Compute variance of pixel intensities return np.mean(sobel_magnitude) + variance # Combine Sobel and variance 6. 基于 Laplacian 的方法
效果对比 ![]() ![]() ![]() ![]() ![]() ![]() 性能比较 我们根据各种焦点算子识别最佳聚焦帧的能力来分析和比较它们的性能。 ![]()
因此,要选择最清晰的帧,Tenengrad、Laplacian 和 Sobel + Variance 应该是首选。 |
|
来自: 新用户0118F7lQ > 《待分类》