OpenCV7图像金字塔与轮廓检测
发布日期:2021-05-07 00:19:14 浏览次数:20 分类:技术文章

本文共 4527 字,大约阅读时间需要 15 分钟。

7.图像金字塔与轮廓检测

import cv2import numpy as npfrom matplotlib import pyplot as plt#图像金字塔 拉普拉斯金字塔 图像轮廓#显示图片def imgShow(title,imgData):    cv2.imshow(title,imgData)    cv2.waitKey()    cv2.destroyAllWindows()#图像金字塔   向下采样cv2.pyrUp(img)图片缩小一倍损失的像素是像素的偶数行和列   向上采样cv2.pyrDown(img)图片放大一倍 填充的像素用0填充img = cv2.imread(r"C:\Users\Administrator\Pictures\Camera Roll\lenna.jpg")up = cv2.pyrUp(img) #向上采样down = cv2.pyrDown(img) #向下采样# r = np.hstack((img,up,down))# imgShow(r"result",up)#拉普拉斯金字塔 输入图像-向上采样(向下采样)lup = img - cv2.pyrUp(cv2.pyrDown(img))# imgShow(r"result",lup)#图像轮廓  # 1.寻找轮廓 binary,contours,hierarchy = cv2.findContours(img,model,method)   # ! opencv2返回两个值:contours:hierarchy。注:opencv3会返回三个值,分别是img, countours, hierarchy# {binary:图片,# contours:轮廓点数据,# hierarchy:层# }# model轮廓检索模式  [# RETR_EXTERNAL:只检索最外面的轮廓,# RETR_LIST:检索所有的轮廓,并将其保存到一条链表中,# RETR_CCOMP:检索所有的轮廓,并将它们组织为两层,顶层是各部分的外部边界,第二层是空洞的边界,# RETR_TREE:检索所有的轮廓,并重构嵌套整个轮廓所有的层次#]#method轮廓逼近的方法[# CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形,# CHAIN_APPROX_SIMPLE:压缩水平的,垂直的和斜的部分,也就是函数只保留它们的终点部分# ]# 2.绘制轮廓 dst = cv2.drayContours(img,contours,-1,(0,0,255),2) # {   # img:处理图像数据,# contours:轮廓点数,# -1:表示绘制所有轮廓,# (0,0,255):表示绘制使用的颜色,# 2:绘制的宽度,# dst:生成轮廓的结果# }  #处理  1.先将图片做灰阶处理 2.将图像做二值阈值处理cImg = cv2.imread(r"C:\Users\Administrator\Pictures\Camera Roll\cont.jpg")cImg1 = cv2.cvtColor(cImg,cv2.COLOR_BGR2GRAY) #灰阶处理ret,thresh = cv2.threshold(cImg1,127,255,cv2.THRESH_BINARY) #阈值二值化处理contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) #寻找轮廓点dst = cImg.copy()dst = cv2.drawContours(cImg,contours,-1,(0,0,255),2)  #绘制轮廓点  -1显示所有轮廓# imgShow(r"result",dst)#轮廓特征con = contours[25]##获取轮廓面积 cv2.contourArea(contour)print(cv2.contourArea(con)) ##获取轮廓周长 True:表示闭合的  cv2.arcLength(contour,True)print(cv2.arcLength(con,True))#轮廓近似  approx = cv2.approxPolyDP(con,epsion,True)  取轮廓近似值 {cnt:轮廓,epsion:周长}epsion = 0.1*cv2.arcLength(con,True)approx = cv2.approxPolyDP(con,epsion,True)dstImg = cImg.copy()dstApprox = cv2.drawContours(dstImg,[approx],-1,(0,0,255),2)# imgShow(r"result",dstApprox)#边界矩形  # cv2.rectangle(cImg,(x,y),(x+w,y+h),(0,0,255),2) {(x,y):起点坐标,(x+w,y+h):终点坐标,(0,0,255):绘制颜色,2:绘制宽度}  x,y,w,h = cv2.boundingRect(con)rImg = cImg.copy()rImg = cv2.rectangle(rImg,(x,y),(x+w,y+h),(0,0,255),2)# imgShow(r"result",rImg)##轮廓面积与边界矩形比x,y,w,h = cv2.boundingRect(con)area = cv2.contourArea(con)rate = float(area)/(w*h)print(rate)#外接圆  # (x,y),radius = cv2.minEnclosingCircle(con) 获取轮廓的外接圆# cv2.circle(imgData,(x,y),radius,(0,0,255),2) 画圆(x,y),radius = cv2.minEnclosingCircle(con)  #获取轮廓的外接圆center = (int(x),int(y))radius = int(radius)cirImg = cImg.copy()circle = cv2.circle(cirImg,center,radius,(0,0,255),2)# imgShow(r"circle",circle)#模板匹配  # cv2.matchTemplate(imgData,template,methods)# methods:匹配方式# [# TM_SQDIFF:计算平方不同,计算出来的值越小,越相关,# TM_CCORR:计算相关性,计算出来的值越大,越相关,# TM_CCOEFF:计算相关系数,计算出来的值越大,越相关,# TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关,# TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关,# TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关# ]# minValue,maxValue,minLoc,maxLoc = cv2.minMaxLoc(rets);  获取最小值,最大值以及对应的最小值最大值的位置per = cv2.imread(r"C:\Users\Administrator\Pictures\Camera Roll/lenna.jpg")face = cv2.imread(r"C:\Users\Administrator\Pictures\Camera Roll/face.jpg",cv2.IMREAD_GRAYSCALE)pers = cv2.cvtColor(per,cv2.COLOR_BGR2GRAY)methods = ['cv2.TM_SQDIFF','cv2.TM_CCORR','cv2.TM_CCOEFF','cv2.TM_SQDIFF_NORMED','cv2.TM_CCORR_NORMED','cv2.TM_CCOEFF_NORMED']for meth in methods:    method = eval(meth)    res = cv2.matchTemplate(pers,face,method)    minValue,maxValue,minLoc,maxLoc = cv2.minMaxLoc(res)  #获取位置    if meth =='cv2.TM_SQDIFF' or meth =='cv2.TM_SQDIFF_NORMED':        top_loc = minLoc    else:        top_loc = maxLoc    p1 = per.copy()    cv2.rectangle(p1,top_loc,(top_loc[0]+face.shape[0],top_loc[1]+face.shape[1]),255,2)  #绘制矩形    plt.subplot(121),plt.imshow(res,cmap='gray')    plt.xticks([]),plt.yticks([])    plt.subplot(122),plt.imshow(p1,cmap='gray')    plt.xticks([]),plt.yticks([])    plt.suptitle(meth)    # plt.show()##匹配多个对象 np.where()ao = cv2.imread(r"C:\Users\Administrator\Pictures\Camera Roll/ou.jpg")dou = cv2.imread(r"C:\Users\Administrator\Pictures\Camera Roll/wen.jpg",cv2.IMREAD_GRAYSCALE)aoG = cv2.cvtColor(ao,cv2.COLOR_BGR2GRAY)res = cv2.matchTemplate(aoG,dou,cv2.TM_CCORR_NORMED)thres = 0.98loc = np.where(res>=thres)print(np.array(loc).shape)for pt in zip(*loc[::-1]):    # minV,maxV,minL,maxL = cv2.minMaxLoc(pt)    top_right = (pt[0]+dou.shape[0],pt[1]+dou.shape[1])    cv2.rectangle(ao,pt,top_right,(0,0,255),1)imgShow(r"result",ao)

在这里插入图片描述

上一篇:OpenCV8直方图与傅里叶变换
下一篇:OpenCV6边缘检测[Canny算法]

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年03月26日 15时02分10秒