
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)
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月26日 15时02分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kotlin实现冒泡排序
2019-03-01
NodeJS下TypeScript环境安装
2019-03-01
汽车后市场,小程序为何独占鳌头
2019-03-01
短视频小程序,互联网新风口
2019-03-01
Mybatis-plus代码生成器模板(MySQL数据库)
2019-03-01
使用redis管理Mybatis的二级缓存
2019-03-01
使用redis管理Mybatis-Plus的二级缓存
2019-03-01
Mybatis中的SQL语句等于、不等于和模糊查询的语法
2019-03-01
使用 github 搜索
2019-03-01
java有包名的类访问没有包名的类
2019-03-01
整型关键字的散列映射
2019-03-03
多位水仙花数-python(出现运行超时?不妨用减法计算)
2019-03-03
地下迷宫探索(后两个测试点无法通过?这里有你想要的答案)
2019-03-03
小白看完都会了!阿里云大师深入拆解Java虚拟机,看完这一篇你就懂了
2019-03-03
VBA之正则表达式(19)-- 相对引用转绝对引用
2019-03-03
巧用VBA统一数字单位
2019-03-03
Transpose实现数组行列转置的限制
2019-03-03
用float/double作为中转类型的“雷区”
2019-03-03
golang中interface的一些语法缺陷的改进
2019-03-03