python3.7.6
opencv-python~=4.5.5.62
numpy~=1.19.3
代码:
# https://www.sciencedirect.com/science/article/abs/pii/S0923596518302832
# GFDF 基于导向滤波检测聚焦区域的多焦图像融合
import numpy as np
import cv2
# 读取图片
img_path = ["../PS/11/4.JPG", "../PS/11/2.JPG", "../PS/11/3.JPG", "../PS/11/1.JPG"] # 此处为待合成的图片路径列表
imgs = [cv2.imread(img) for img in img_path]
imgs_gray = [cv2.imread(img, 0) for img in img_path]
# 均值滤波
# 对每张单层图像分别使用均值滤波进行平滑
imgs_blur = []
for i, img in enumerate(imgs_gray):
img = cv2.blur(img, ksize=(25, 25))
imgs_blur.append(img)
# cv2.namedWindow('blur'+str(i), cv2.WINDOW_NORMAL)
# cv2.imshow("blur"+str(i), img)
# 获取粗略的聚焦图
# 使用原图和平滑图相减获取粗略的聚焦图,原图中的模糊区域,平滑后仍是模糊的
imgs_rfm = []
for i in range(len(imgs_gray)):
img1 = cv2.subtract(imgs_blur[i], imgs_gray[i])
img2 = cv2.subtract(imgs_gray[i], imgs_blur[i])
img = cv2.add(img1, img2)
imgs_rfm.append(img)
# cv2.namedWindow('rfm'+str(i), cv2.WINDOW_NORMAL)
# cv2.imshow("rfm"+str(i), img*5)
# 导向滤波
# 将原图作为导向图,通过导向滤波器向粗略的聚焦图中添加更多的高频信息,从而优化高频部分的融合效果
imgs_afm = []
for i in range(len(imgs_gray)):
img = cv2.ximgproc.guidedFilter(imgs_gray[i], imgs_rfm[i], 10, 2, -1)
imgs_afm.append(img)
# cv2.namedWindow('afm'+str(i), cv2.WINDOW_NORMAL)
# cv2.imshow("afm"+str(i), img*5)
# 决策图生成
# 通过比较聚焦图中每个像素值大小的方式决定融合图中的像素主要来自于哪一张单层图
imgs_idm = []
img_max = imgs_afm[0].copy()
for i in range(len(imgs_afm)):
idx = img_max < imgs_afm[i]
img_max[idx] = imgs_afm[i][idx]
for i, img in enumerate(imgs_afm):
ret, img = cv2.threshold(cv2.subtract(img_max, img), 0, 1, cv2.THRESH_BINARY_INV)
imgs_idm.append(img)
# cv2.namedWindow('idm'+str(i), cv2.WINDOW_NORMAL)
# cv2.imshow("idm"+str(i), img*255)
# 拼接
img = imgs[0].copy()
for i in range(len(imgs)):
imgs[i] = cv2.bitwise_and(imgs[i], imgs[i], mask=imgs_idm[i])
idx = (imgs[i] != 0)
img[idx] = imgs[i][idx]
cv2.namedWindow('result', cv2.WINDOW_NORMAL)
cv2.imshow("result", img)
cv2.waitKey(0)