《计算机视觉技术与应用》-----第七章 模版匹配和图像分割

系列文章目录

《计算机视觉技术与应用》-----第二章 图像处理基础

《计算机视觉技术与应用》-----第三章 图形用户界面

《计算机视觉技术与应用》-----第四章 图像变换

《计算机视觉技术与应用》-----第五章 边缘和轮廓

《计算机视觉技术与应用》-----第六章 边缘和轮廓

《计算机视觉技术与应用》-----第七章 边缘和轮廓

《计算机视觉技术与应用》----- 重点复盘


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、单目标匹配
  • 二、多目标匹配
  • 三、图像金字塔
  • 三、应用图像金字塔实现图像的分割和融合
    • 2.读入数据
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、单目标匹配

将模板图像拿到原图去寻找,如果能在原图中找到(如蜜蜂),则用矩形框画出来。
《计算机视觉技术与应用》-----第七章 模版匹配和图像分割_第1张图片
《计算机视觉技术与应用》-----第七章 模版匹配和图像分割_第2张图片

#test7-1.py:单目标匹配
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('bee.jpg')                         	#打开输入图像,默认BGR格式
cv2.imshow('original',img1)

temp=cv2.imread('template.jpg')                     	#打开模板图像
cv2.imshow('template',temp)

img1gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY,dstCn=1)  #转换为单通道灰度图像 dstCn表示目标图像的通道数
tempgray=cv2.cvtColor(temp,cv2.COLOR_BGR2GRAY,dstCn=1)  #转换为单通道灰度图像 dstCn=1表示单通道

h,w=tempgray.shape                                     	#获得模板图像的高度和宽度
res=cv2.matchTemplate(img1gray,tempgray,cv2.TM_SQDIFF) #执行匹配 以方差结果为依据进行匹配。完全匹配时结果为0
plt.imshow(res,cmap = 'gray')                  		#以灰度图像格式显示匹配结果 图中颜色越深的位置匹配度越高
plt.title('Matching Result')                           
plt.axis('off')                                         #关闭两者坐标轴,只有曲线图形 如果是"on"则有坐标轴
plt.show()                                      		#显示图像

min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)  #返回匹配位置 返回的是坐标
top_left = min_loc                                  #最小值为最佳匹配,获得其位置
print(top_left)
print(max_loc)
print(min_val)
print(max_val)
bottom_right = (top_left[0] + w, top_left[1] + h)#获得匹配范围的右下角位置
cv2.rectangle(img1,top_left, bottom_right,(255,0,0), 2)#绘制匹配范围,蓝色边框
cv2.imshow('Detected Range',img1)
cv2.waitKey(0)

二、多目标匹配

《计算机视觉技术与应用》-----第七章 模版匹配和图像分割_第3张图片

三、图像金字塔

向下采样
《计算机视觉技术与应用》-----第七章 模版匹配和图像分割_第4张图片

#test7-5.py:高斯金字塔向下采样
import cv2
img0=cv2.imread('qizi.jpg')
img1=cv2.pyrDown(img0)          #第1次采样
img2=cv2.pyrDown(img1)          #第2次采样
cv2.imshow('img0',img0)       #显示第0层
cv2.imshow('img1',img1)       #显示第1层
cv2.imshow('img2',img2)       #显示第2层
print('0层形状:',img0.shape)             #输出图像形状
print('1层形状:',img1.shape)             #输出图像形状
print('2层形状:',img2.shape)             #输出图像形状
cv2.waitKey(0)

向上采样
《计算机视觉技术与应用》-----第七章 模版匹配和图像分割_第5张图片

#test7-6.py:高斯金字塔向上采样
import cv2
img0=cv2.imread('qizi2.jpg')
img1=cv2.pyrUp(img0)          #第1次采样
img2=cv2.pyrUp(img1)          #第2次采样
cv2.imshow('img0',img0)       #显示第0层
cv2.imshow('img1',img1)       #显示第1层
cv2.imshow('img2',img2)       #显示第2层
print('0层形状:',img0.shape)             #输出图像形状
print('1层形状:',img1.shape)             #输出图像形状
print('2层形状:',img2.shape)             #输出图像形状
cv2.waitKey(0)

拉普拉斯金字塔
《计算机视觉技术与应用》-----第七章 模版匹配和图像分割_第6张图片

#test7-7.py:拉普拉斯金字塔
import cv2
img0=cv2.imread('qizi.jpg')
img1=cv2.pyrDown(img0)          #第1次采样
img2=cv2.pyrDown(img1)          #第2次采样
img3=cv2.pyrDown(img2)          #第3次采样
imgL0= cv2.subtract( img0,cv2.pyrUp(img1))     #拉普拉斯金字塔第0层 使用cv2.subtract()函数
imgL1= cv2.subtract(img1,cv2.pyrUp(img2) )     #拉普拉斯金字塔第1层
imgL2= cv2.subtract(img2,cv2.pyrUp(img3) )     #拉普拉斯金字塔第2层
cv2.imshow('imgL0',img0)       #显示第0层
cv2.imshow('imgL1',img1)       #显示第1层
cv2.imshow('imgL2',img2)       #显示第2层
cv2.waitKey(0)

图像减法看参考:OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比

三、应用图像金字塔实现图像的分割和融合

《计算机视觉技术与应用》-----第七章 模版匹配和图像分割_第7张图片

import numpy as np
#test7-8.py:应用图像金字塔实现图像融合
import cv2
img1 = cv2.imread('jiang1.jpg')
img2 = cv2.imread('jiang2.jpg')
cv2.imshow('1',img1)
cv2.imshow('2',img2)
#生成图像1的高斯金字塔,向下采样6次
img = img1.copy()
img1Gaus = [img]
for i in range(6):
    img = cv2.pyrDown(img)
    img1Gaus.append(img)
#生成图像2的高斯金字塔,向下采样6次
img = img2.copy()
img2Gaus = [img]
for i in range(6):
    img = cv2.pyrDown(img)
    img2Gaus.append(img)
#生成图像1的拉普拉斯金字塔,6层
img1Laps = [img1Gaus[5]]
for i in range(5,0,-1):
    img = cv2.pyrUp(img1Gaus[i])
    lap = cv2.subtract(img1Gaus[i-1],img)    #两个图像大小不同时,做减法会出错
    img1Laps.append(lap)
#生成图像2的拉普拉斯金字塔,6层
img2Laps = [img2Gaus[5]]
for i in range(5,0,-1):
    img = cv2.pyrUp(img2Gaus[i])
    lap = cv2.subtract(img2Gaus[i-1],img)
    img2Laps.append(lap)
#拉普拉斯金字塔拼接:图像1每层左半部分与和图像2每层右半部分拼接
imgLaps = []
for la,lb in zip(img1Laps,img2Laps):
    rows,cols,dpt = la.shape
    ls=la.copy()
    ls[:,int(cols/2):]=lb[:,int(cols/2):]
    imgLaps.append(ls)
#从拉普拉斯金字塔恢复图像 将拼接后的图像向上采样6次 (分割和融合后的图像结果)
img = imgLaps[0]
for i in range(1,6):
    img = cv2.pyrUp(img)
    img = cv2.add(img, imgLaps[i])
#图像1原图像的半部分与和图像2原图像的右左半部分直接拼接(做对比,直接拼接的结果)
direct = img1.copy()
direct[:,int(cols/2):]=img2[:,int(cols/2):]
cv2.imshow('Direct',direct)             #显示直接拼接结果
cv2.imshow('Pyramid',img)               #显示图像金字塔拼接结果
cv2.waitKey(0)

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(计算机视觉技术与应用,计算机视觉,python,opencv)