图像拼接案例,抠图案例

目录

一.图像拼接案例

1.图像拼接项目介绍

2.核心步骤

①计算图片特征点及描述符

②匹配特征点,使用暴力匹配器

③筛选有效匹配

④计算透视变换矩阵

⑤应用变换和拼接

二.抠图案例

1.缩放旋转处理

2.转化为灰度图并二值化

3.找出所有轮廓,并在img的副本上画出

4.排序轮廓找到最大的扇子轮廓

5.创建掩膜

6.'与'操作,完成抠图


一.图像拼接案例

1.图像拼接项目介绍

  • 目标:将两张视角不同、角度倾斜的图片(如包含A/B/C物的图片)如下通过算法融合,使其在同一平面视角下呈现。
  • 技术路径:
    • 使用SIFT特征提取两个图片中的关键点和描述符。
    • 采用暴力匹配器(bf_match )进行特征匹配,因其适用于特征点数量较少的场景
    • 基于匹配结果计算并应用透视变换,最终完成两图拼接。

2.核心步骤

读取拼接图片

python 复制代码
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
python 复制代码
#读取拼接图片
imageA=cv2.imread('1.jpg')
cv_show('imageA',imageA)
imageB=cv2.imread('2.jpg')
cv_show('imageB',imageB)

①计算图片特征点及描述符

使用SIFT算法从两张图片中提取关键点和描述符,利用BFMatcher进行暴力匹配,获得初步的点对匹配结果。

特征提取我们直接定义一个方法来实现

python 复制代码
def detectAndDescribe(image):
    gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    sift=cv2.SIFT_create()
    (kps,des)=sift.detectAndCompute(gray,None)
    kps_float=np.float32([kp.pt for kp in kps])
    return (kps,kps_float,des)

kps_float是特征点的坐标x和y的ndarray类型的数组

python 复制代码
#计算图片特征点及描述符
(kpsA,kps_floatA,desA)=detectAndDescribe(imageA)
(kpsB,kps_floatB,desB)=detectAndDescribe(imageB)

②匹配特征点,使用暴力匹配器

python 复制代码
#建立暴力匹配器
matcher=cv2.BFMatcher()
rawMatches=matcher.knnMatch(desB,desA,k=2)

③筛选有效匹配

通过设定距离阈值(如近点距离小于远点距离的65%)筛选出可靠的匹配点。

python 复制代码
good=[]
matches=[]
for m in rawMatches:
    if len(m)==2 and m[0].distance<0.65*m[1].distance:
        good.append(m)
        matches.append((m[0].queryIdx,m[0].trainIdx))
print(len(good))
print(matches)

31
[(14, 76), (36, 105), (39, 105), (63, 118), (65, 121), (66, 122), (74, 130), (83, 128), (87, 136), (93, 140), (105, 147), (118, 172), (138, 176), (154, 191), (155, 192), (158, 198), (164, 213), (165, 206), (176, 217), (185, 227), (201, 242), (202, 243), (204, 246), (207, 250), (209, 255), (212, 257), (217, 7), (228, 275), (229, 276), (231, 275), (233, 276)]

good存放匹配成功的最近点和次近点相关信息

matches用来存放desA特征图片的匹配成功特征点索引和desB特征图片的匹配成功特征点索引的元组

画出两幅图之间的特征点对应联系

python 复制代码
vis=cv2.drawMatchesKnn(imageB,kpsB,imageA,kpsA,good,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv_show('Keypoint Matches',vis)

④计算透视变换矩阵

利用筛选出的核心特征点,计算出变换矩阵H使得一张图片能精确地"变形"到与另一张图片相同的视角平面上。

python 复制代码
#透视变换
if len(matches)>4:#当筛选后的匹配对大于4时,计算视角变换矩阵
    #获取匹配对的点坐标
    ptsB=np.float32([kps_floatB[i] for (i,_) in matches])
    ptsA=np.float32([kps_floatA[i] for (_,i) in matches])

    (H,mask)=cv2.findHomography(ptsB,ptsA,cv2.RANSAC,10)
else:
    print('图片未找到四个以上的匹配点')
    sys.exit()

注意点数范围(至少4个)

mask数组用于标识内点与外点。

⑤应用变换和拼接

变换,这里图片的宽度我们使用土图片A和图片B的宽度和方便后面直接将A图片拼接上来

python 复制代码
result=cv2.warpPerspective(imageB,H,(imageB.shape[1]+imageA.shape[1],imageB.shape[0]))
cv_show('resultB',result)

拼接,将图片A传入result图片最左端

python 复制代码
#将图片A传入result图片最左端
result[0:imageA.shape[0],0:imageA.shape[1]]=imageA
cv_show('result',result)
cv2.imwrite('pingjie.jpg',result)

二.抠图案例

实现只将图中的扇子抠图出来,核心技术用到掩膜

1.缩放旋转处理

python 复制代码
import cv2
import numpy as np

img=cv2.imread('img.jpg')
img=cv2.resize(img,(640,480))
img=np.rot90(img,1)
cv2.imshow('img',img)

2.转化为灰度图并二值化

这里我们没有使用阈值的方法来二值化而是使用Canny()边缘检测实现二值化

python 复制代码
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edged=cv2.Canny(gray,75,200)
cv2.imshow('edged',edged)
cv2.waitKey(0)

3.找出所有轮廓,并在img的副本上画出

python 复制代码
cnts=cv2.findContours(edged.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]
cv2.drawContours(img_cnts,cnts,-1,(0,0,255),2)
cv2.imshow('img_cnts',img_cnts)
cv2.waitKey(0)

4.排序轮廓找到最大的扇子轮廓

python 复制代码
cnt=sorted(cnts,key=cv2.contourArea,reverse=True)[0]

5.创建掩膜

先创建和eddged图片等大的全黑掩膜,再根据扇子的轮廓把掩膜中该部分变成白色

python 复制代码
mask = np.zeros(edged.shape, dtype='uint8')
cv2.drawContours(mask, [cnt], -1, 255, -1)  # -1表示填充
cv2.imshow('mask',mask)
cv2.waitKey(0)

6.'与'操作,完成抠图

python 复制代码
img_mask_and=cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('img_mask_and',img_mask_and)
cv2.waitKey(0)

cv2.bitwise_and(img,img,mask=mask)会指将掩膜中白色的部分显示出来

相关推荐
nju_spy6 小时前
牛客网 AI题(二)机器学习 + 深度学习
人工智能·机器学习·笔试·tf-idf·pca·位置编码·k-means
周杰伦_Jay6 小时前
【Mac下通过Brew安装Ollama 】部署 DeepSeek 轻量模型(实测版)
人工智能·macos·数据挖掘·database·1024程序员节
北青网快讯6 小时前
CDN5上线AI智能防御系统,为香港CDN加速服务注入新一代安全与智能动力
人工智能·安全
IT_陈寒6 小时前
Python 3.12震撼发布:5大性能优化让你的代码提速50%,第3点太香了!
前端·人工智能·后端
B站_计算机毕业设计之家7 小时前
计算机视觉:python车牌识别检测系统 YOLOv8 深度学习pytorch技术 LPRNet车牌识别算法 CCPD2020数据集 ✅
大数据·python·深度学习·机器学习·计算机视觉·数据分析·车牌识别
这个世界的真神7 小时前
【每日算法】 洛谷 P12341 【[蓝桥杯 2025 省 A/Python B 第二场] 消消乐】 2025.10.26
python·算法·蓝桥杯
恋猫de小郭7 小时前
今年各大厂都在跟进的智能眼镜是什么?为什么它突然就成为热点之一?它是否是机会?
android·前端·人工智能
l1t7 小时前
利用DeepSeek改写递归CTE SQL语句为Python程序及优化
数据库·人工智能·python·sql·算法·性能优化·deepseek
Debroon8 小时前
用FastAPI封装Qwen云端API,本机Postman测试,再用Django做前端界面调用
人工智能
寄思~8 小时前
python批量读取word表格写入excel固定位置
开发语言·python·excel