如何生成照片失焦区域的遮罩?已实现Laplace焦点检测不知后续处理
实现思路
拉普拉斯算子输出的绝对值大小直接对应区域的锐度:绝对值越高,边缘响应越强,区域越清晰;绝对值越低,区域越模糊。基于这个特性生成模糊区域遮罩的优化方案如下:
- 对拉普拉斯输出做绝对值转换+数值归一化,得到可直接用于阈值判断的锐度响应图
- 用OTSU自动阈值替代固定阈值/简单高斯模糊+阈值的方案,自动适配不同图像的锐度分布,大幅提升准确率
- 增加形态学后处理,消除遮罩中的零散噪点、补全区域空洞
你提供的拉普拉斯滤波效果参考:
你之前用高斯模糊+阈值得到的低准确率结果参考:
优化后代码
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
相关产品推荐
相关产品推荐

