You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成照片失焦区域的遮罩?已实现Laplace焦点检测不知后续处理

实现思路

拉普拉斯算子输出的绝对值大小直接对应区域的锐度:绝对值越高,边缘响应越强,区域越清晰;绝对值越低,区域越模糊。基于这个特性生成模糊区域遮罩的优化方案如下:

  1. 对拉普拉斯输出做绝对值转换+数值归一化,得到可直接用于阈值判断的锐度响应图
  2. 用OTSU自动阈值替代固定阈值/简单高斯模糊+阈值的方案,自动适配不同图像的锐度分布,大幅提升准确率
  3. 增加形态学后处理,消除遮罩中的零散噪点、补全区域空洞

你提供的拉普拉斯滤波效果参考:
Laplace filter effect

你之前用高斯模糊+阈值得到的低准确率结果参考:
result1

优化后代码

import numpy as np
import cv2

imgPath = r"IMG_0727.jpg"
img = cv2.imread(imgPath)
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

def laplaceFilter(image):
    kernel_size = 5
    blur_size = 5
    blurred = cv2.GaussianBlur(image, (blur_size,blur_size), 0)
    lap = cv2.Laplacian(blurred, cv2.CV_64F, ksize=kernel_size)
    # 取绝对值并归一化到0-255
    abs_lap = np.absolute(lap)
    norm_lap = ((abs_lap - abs_lap.min()) / (abs_lap.max() - abs_lap.min()) * 255).astype('uint8')
    return norm_lap

# 得到锐度响应图
laplace_map = laplaceFilter(imgGray)
cv2.imwrite("laplaceFilter.png", laplace_map)

# 用OTSU自动阈值分割,低于阈值的区域判定为模糊区域
_, blur_mask = cv2.threshold(laplace_map, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 形态学后处理:去掉噪点,补全空洞
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
blur_mask = cv2.morphologyEx(blur_mask, cv2.MORPH_OPEN, kernel)
blur_mask = cv2.morphologyEx(blur_mask, cv2.MORPH_CLOSE, kernel)

# 保存模糊区域遮罩,白色为模糊区域,黑色为清晰区域
cv2.imwrite("blur_mask.png", blur_mask)

# 如果需要在原图上叠加遮罩查看效果
mask_color = np.zeros_like(img)
mask_color[blur_mask == 255] = [0,0,255] # 模糊区域标红
overlay_result = cv2.addWeighted(img, 0.7, mask_color, 0.3, 0)
cv2.imwrite("overlay_result.png", overlay_result)

可选优化方向

  • 如果图像局部光照差异极大,可以把全局OTSU阈值换成自适应局部阈值,调用cv2.adaptiveThreshold即可
  • 形态学核的大小可以根据你的图像分辨率调整,分辨率越高核可以适当调大

内容的提问来源于stack exchange,提问作者Mc Gavish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:24:02