首页 > 其他分享 >图像拼接融合

图像拼接融合

时间:2023-05-30 15:47:22浏览次数:35  
标签:matches mask cv2 融合 拼接 图像 np img2 img1

图像拼接、融合是全景拼接的基础操作,opencv库提供了stitch方法,该方法相当完备,就是速度有点慢。

我也实现了一个类似的方法,其流程为:特征提取、特征匹配、透视变换、掩膜生成、羽化融合。

按羽化算法,如下所示,两图交集区域是图像融合的区域,某点距离融合边界(属于图像a)越远,图像a在此点的融合权重越小。

因此,构造权重掩膜需要满足一个约束:

按距离分配融合权重,在图像a融合边界上的点,图像a的融合权重为1,图像b为0。

import cv2
import numpy as np

def image_rotate(src, rotate=0):
  h,w,c = src.shape
  cos_val = np.cos(np.deg2rad(rotate))
  sin_val = np.sin(np.deg2rad(rotate))
  M = np.float32([[cos_val, sin_val, 0], [-sin_val, cos_val, 0]])
  img = cv2.warpAffine(src, M, (w,h))
  return img


 # Open the image files.
img1_color = image_rotate(cv2.imread("picb.png"),0)  # Image to be aligned.
img2_color = image_rotate(cv2.imread("pica.png"),5)   # Reference image.

 # Convert to grayscale.
img1 = cv2.cvtColor(img1_color, cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img2_color, cv2.COLOR_BGR2GRAY)
height, width = img2.shape

 # Create ORB detector with 5000 features.
orb_detector = cv2.ORB_create(5000)

 # Find keypoints and descriptors.

# The first arg is the image, second arg is the mask

#  (which is not required in this case).
kp1, d1 = orb_detector.detectAndCompute(img1, None)
kp2, d2 = orb_detector.detectAndCompute(img2, None)

 # Match features between the two images.

# We create a Brute Force matcher with

# Hamming distance as measurement mode.
matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck = True)
 # Match the two sets of descriptors.
matches = list(matcher.match(d1, d2))
 # Sort matches on the basis of their Hamming distance.
matches.sort(key = lambda x: x.distance)
 # Take the top 90 % matches forward.
matches = matches[:int(len(matches)*0.9)]
no_of_matches = len(matches)

# Define empty matrices of shape no_of_matches * 2.
p1 = np.zeros((no_of_matches, 2))
p2 = np.zeros((no_of_matches, 2))
for i in range(len(matches)):
  p1[i, :] = kp1[matches[i].queryIdx].pt
  p2[i, :] = kp2[matches[i].trainIdx].pt
 # Find the homography matrix.
homography, mask = cv2.findHomography(p1, p2, cv2.RANSAC)
 # Use this matrix to transform the
# colored image wrt the reference image.


#image fusion
#create mask for fusion
img1_mask = np.zeros(img1.shape, np.uint8)
img1_mask.fill(255)
img1_mask = cv2.warpPerspective(img1_mask,
                    homography, (width*2, height))
img2_mask=np.zeros(img2.shape, np.uint8)
img2_mask.fill(255)
img2_mask=cv2.copyMakeBorder(img2_mask,0,0,0,img2.shape[1], cv2.BORDER_CONSTANT,value=0)
img_and = cv2.bitwise_and(img1_mask, img2_mask)
img_xor=cv2.bitwise_xor(img1_mask, img_and)
#distance transformer
img1_distance=cv2.distanceTransform(img1_mask, cv2.DIST_L2, 0)
t,img1_distance=cv2.threshold (img1_distance,255,255,cv2.THRESH_TRUNC)
img1_distance=np.uint8(img1_distance)
dst = cv2.bitwise_and(img1_distance, img_and)

#satisfied to constraints
img2_g=cv2.copyMakeBorder(img2,0,0,0,img2.shape[1], cv2.BORDER_CONSTANT,value=0)
img1_g = cv2.warpPerspective(img1,
                    homography, (width*2, height))
h=np.ones(img1_g.shape)
max=dst.max()
for i in range(dst.shape[0]):
    temp_max=dst[i,:].max()
    dst[i, :]=dst[i,:]/temp_max*max
dst=dst/max
img_xor=img_xor/img_xor.max()
dst=dst+img_xor
cv2.imwrite('mask.jpg', dst*max)

fusion_img=(h-dst)*img2_g+dst*img1_g
cv2.imwrite('stitch and fusion.jpg', fusion_img)

构造融合掩膜(符合羽化算法约束)

 

 

 

 

标签:matches,mask,cv2,融合,拼接,图像,np,img2,img1
From: https://www.cnblogs.com/xmds/p/17443401.html

相关文章

  • 基于压缩感知和KSVD的图像去噪算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的。K-SVD通过构建字典来对数据进行稀疏表示,经常用于图像压缩、编码、分类等......
  • EasyCVR视频融合平台设备分组共享功能的使用介绍
    EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议、多类型的设备接入,并能对设备进行分级、分组管理,并支持权限、角色分配,属于功能全面、性能稳定、高可靠、高可用的流媒体视频云服务平台。很多用户都使用过平台......
  • [转]基于图像的三维模型重建4——增量SFM
    内容几种BA的形式同时优化相机和三维点优化相机只优化三维点单目相机增量运动恢复结构(IncrementalSFM)运动恢复结构的几个问题几种BA的形式数学模型n个三维点和m个相机,一些三维点在相机上的投影点。i表示三维点的索引,j表示相机的索引。 u 表示观测点, u^ 表示理......
  • 数字图像处理
    数字图像处理与python实现1.数字图像处理基础知识1.1数字图像简介目的提升图像的视觉感知质量提取图像中感兴趣区域或特征方便图像的存储和运输特点可再现能力强处理精度高适用范围广灵活性高方法图像变换图像压缩编码图像增强和复原图像分割图像描述图像分类(......
  • 图像入门3
    图像识别30.序章​ 从本章起,我们的OpenCV将会插入一段美好而虚空的幻想故事……请各位勇士进入幻境,开始你们的学习之旅。1.大纲1、处理OpenCV中鼠标事件2、学习以鼠标作为画笔,如cv.setMouseCallback()函数2.使用鼠标作为画笔1)鼠标回调函数​ 在遥远的圣彼得堡,住着一......
  • 图像入门2
    图像入门21.大纲1、使用OpenCV绘制不同的几何形状2、学习以下功能:cv.line(),cv.circle(),cv.rectangle(),cv.sllipse(),cv.putText()等2.常见参数img:绘制形状的图像color:形状的颜色,作为元组传递厚度:线或圆等的粗细。对闭合图形传递-1,填充形状,默认厚度为1lineType:线的类......
  • 【计算机视觉】---平滑图像
    简介计算机视觉中平滑图像的原理是通过一系列的图像处理操作,对图像中的噪声进行抑制和去除,以达到平滑图像的效果。平滑图像的主要目的是减少图像中的细节和噪声,以便更好地进行后续的图像分析和处理。均值滤波:平滑图像的一种常见方法是通过邻域操作对每个像素周围的像素进行处理。常......
  • 在jsp中为a标签的href属性拼接动态变量的方法
    在做web项目练习时遇到了一个需要为href拼接动态变量的问题,在jsp中有这么一段代码实现用户的删改功能。首先摆出我一开始错误的代码来说明问题。<html><head><title>人员管理</title></head><body><%//从后端Servlrt获取的一个储存我自定义的Persion对象的ListList<Pers......
  • 论文解读 | IROS 2022:MV6D:在RGB-D图像上使用深度逐点投票网络进行多视角6D姿态估计
    原创|文BFT机器人01 研究背景在计算机视觉领域,6D姿态估计是一种重要的任务,用于确定物体在3D空间中的位置和方向。它在许多应用领域具有广泛的应用,如机器人操作、虚拟现实、增强现实、物体跟踪等。然而,传统的6D姿态估计方法存在一些限制。这些方法通常只使用单个视角的相机数据......
  • EasyCVR视频融合平台设备分组共享功能的使用介绍
    EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议、多类型的设备接入,并能对设备进行分级、分组管理,并支持权限、角色分配,属于功能全面、性能稳定、高可靠、高可用的流媒体视频云服务平台。很多用户都使用过平台的......