提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在深入探讨图像处理与计算机视觉领域的过程中,我们不禁对图像融合技术的精妙与实用性感到着迷。图像融合不仅是一项融合了美学与科学的技术手段,它还巧妙地将来源各异、特性不同的图像数据整合为一体,从而生成视觉上连贯且富含信息的合成图像。本篇博客文章旨在详尽解析OpenCV库中的一项高级功能cv2.seamlessClone。该功能在图像融合技术中占据着举足轻重的地位,以其独特的算法实现图像间的无缝对接,保证了融合后的图像在视觉上的自然性与一致性
一、概述
图像融合是一种技术过程,它将两个或多个源图像合成为一幅综合图像,旨在整合不同图像中的互补信息,从而创建出一幅在视觉质量和信息内容上都超越单一源图像的新图像。简而言之,图像融合的目标是利用信息的优势互补和视觉效果的优化。泊松图像融合是这一领域的一种先进技术,它能够无缝地结合多个图像,确保融合后的图像在视觉上呈现自然和连续的效果。这种技术在图像编辑、合成、拼接和修复等多个领域都有广泛应用。泊松融合基于数学的泊松方程,采用梯度为基础的融合方法。其显著优势在于能够维持图像的光照和颜色一致性,确保融合区域与周围环境在视觉上和谐一致。尽管如此,泊松融合在面对大幅度光照变化或复杂纹理的场景时,可能存在一定的局限性。
二,实现:
seamlessClone是OpenCV库中提供的一种高级图像融合技术,它可以实现图像的无缝克隆,即使融合区域在颜色、亮度和纹理上与周围环境不同,也能产生自然且难以察觉的融合效果。这种方法特别适用于将一个对象复制到另一个图像中,同时保持目标图像背景的自然性。
seamlessClone使用的是泊松融合技术的一个变种,并结合了多尺度融合策略,以减少融合区域与周围环境的视觉差异。以下是seamlessClone函数的基本使用方法和参数:
result = cv2.seamlessClone(src, dst, mask, p, flags, blend)
参数说明
src: 源图像,通常是要克隆的对象。
dst: 目标图像,即源图像要融合到的背景图像。
mask: 与源图像大小相同的二值掩模图像,其中白色部分表示要克隆的区域。
p: 目标图像中融合区域的中心点坐标,格式为(x, y)。
flags: 控制融合方法的标志。通常使用以下两个值:
cv2.NORMAL_CLONE: 使用正常克隆模式。
cv2.MIXED_CLONE: 使用混合克隆模式,适用于源图像和目标图像具有不同亮度的情况。
或cv 2.MONOCHROME_TRANSFER( 不保留src图像的颜色细节,只有src图像的质地,颜色和目标图像一样,可以用来进行皮肤质地填充)
blend: 可选参数,用于指定混合区域的大小,默认值为None。
返回值
result: 输出图像,包含了源图像和目标图像的无缝融合效果。
使用案例:
import cv2
import numpy as np
def on_mouse(event, x, y, flags, param):
img = cv2.resize(cv2.imread(r"D:\pythonProject\R-C.jpg"), (400,300))
cv2.imshow("image", img)
img2 = img.copy()
if event == cv2.EVENT_LBUTTONDOWN: # 左键点击
param.append(x)
param.append(y)
cv2.circle(img2, tuple(param),10,(0,255,0),5)
cv2.imshow('image', img2)
elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON):#移动鼠标,左键拖拽
cv2.rectangle(img2,tuple(param),(x,y),(255,0,0),15)#需要确定的就是矩形的两个点(左上角与右下角),颜色红色,线的类型(不设置就默认)。
cv2.imshow('image', img2)
elif event == cv2.EVENT_LBUTTONUP: # 左键释放
point2 = (x,y)
cv2.rectangle(img2, tuple(param), point2, (0, 0, 255), 5)#需要确定的就是矩形的两个点(左上角与右下角),颜色蓝色,线的类型(不设置就默认)。
back = cv2.resize(cv2.imread("sky.jpg"),(640,480)) # 读取背景图片
min_x = min(tuple(param)[0],point2[0])
min_y = min(tuple(param)[1],point2[1])
width = abs(tuple(param)[0]-point2[0])
height = abs(tuple(param)[1]-point2[1])
cut_img = img[min_y:min_y+height, min_x:min_x+width]
mask = 255 * np.ones(cut_img.shape, cut_img.dtype)
center = (256, 256)
CLONE_img = cv2.seamlessClone(cut_img,back,mask,center, cv2.NORMAL_CLONE) # 图像融合,将前景和背景进行融合
MIXED_img = cv2.seamlessClone(cut_img, back, mask, center, cv2.MIXED_CLONE)
TRAN_img = cv2.seamlessClone(cut_img, back, mask, center, cv2.MONOCHROME_TRANSFER)
cv2.imshow("CLONE_img",CLONE_img)
cv2.imshow("MIXED_img", MIXED_img)
cv2.imshow("TRAN_img", TRAN_img)
# cv2.imwrite('./crop_image.jpg', cut_img)
def main():
point=[]
cv2.namedWindow('image') # 创建图像窗口窗口名字为image
cv2.setMouseCallback('image', on_mouse,point)
cv2.waitKey(0)
if __name__=='__main__':
main()
效果: