基于python的opencv项目实战笔记(六)—— 图像金字塔与轮廓检测
2021/12/29 22:10:31
本文主要是介绍基于python的opencv项目实战笔记(六)—— 图像金字塔与轮廓检测,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
import cv2 as cv import matplotlib.pyplot as plt import numpy as np def cv_show(name,img): cv.imshow(name,img) cv.waitKey(0) cv.destroyAllWindows() #高斯金字塔 #上采样 def cv_pyrUp(img): up=cv.pyrUp(img) cv_show('up',up) print(up.shape) #下采样 def cv_pyrDown(img): down=cv.pyrDown(img) cv_show('down',down) print(down.shape) #上下采样,会损失信息 def cv_ud(img): up = cv.pyrUp(img) down = cv.pyrDown(up) res=np.hstack((img,down)) cv_show('res', res) print(down.shape) #拉普拉斯金字塔 def cv_la(img): down =cv.pyrDown(img) down_up =cv.pyrUp(down) down_up=cv.resize(down_up,(621,667)) print(down_up.shape) la=img-down_up cv_show('la',la) #图像轮廓(是一个整体) def cv_contour1(): #检索轮廓 img=cv.imread("D://c2.png") gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#转化为灰度图,更好进行边缘检测 ret,thresh=cv.threshold(gray,127,255,cv.THRESH_BINARY)#大于127的为255,小于为0 #cv_show('thresh',thresh) #第一个值为轮廓信息,第二个值为层级 contours,hierarchy=cv.findContours(thresh,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)#第二个参数检索所有轮廓,第三个画出所有点 #绘制轮廓 draw_img=img.copy() res=cv.drawContours(draw_img,contours,-1,(0,0,255),2)#-1标出所有,其他数字为顺序选择 #cv_show('res',res) #轮廓特征 cnt=contours[0]#第0个轮廓 area=cv.contourArea(cnt)#计算面积 length=cv.arcLength(cnt,True)#周长,True表示闭合 print(area) print(length) #轮廓近似 def cv_contour2(): img1 = cv.imread("D://c3.png") gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) cnt=contours[0] draw_img = img1.copy() res = cv.drawContours(draw_img,[cnt], -1, (0, 0, 255), 2) epsilon=0.1*cv.arcLength(cnt,True)#值越小近似越小,越大近似越大 approx=cv.approxPolyDP(cnt,epsilon,True) draw_img = img1.copy() res = cv.drawContours(draw_img,[approx], -1, (0, 0, 255), 2) cv_show('res', res) #边界矩形 def cv_contour3(): src = cv.imread("D://c2.png") gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) cnt = contours[0] area=cv.contourArea(cnt) x,y,w,h=cv.boundingRect(cnt) rect_area=w*h extent=float(area)/rect_area print('轮廓面积与边界矩形比:',extent) src=cv.rectangle(src,(x,y),(x+w,y+h),(0,255,0),2) cv_show('src',src) #外接圆 def cv_contour4(): src = cv.imread("D://c2.png") gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) cnt = contours[0] (x, y),r= cv.minEnclosingCircle(cnt) center=(int(x),int(y)) r=int(r) src=cv.circle(src,center,r,(0,255,0),2) cv_show('src', src) #模板匹配 #从左到右,从上到下,进行匹配 def cv_tm(): img=cv.imread('D://l2.png',0) template=cv.imread('D://l.png',0) h,w=template.shape[:2] methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR', 'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED'] res = cv.matchTemplate(img, template, cv.TM_SQDIFF) min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res) for meth in methods: img2 = img.copy() method = eval(meth) print(method) # 匹配方法的真值 res = cv.matchTemplate(img, template, method) min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res) ''' 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值 ''' if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]: top_left = min_loc else: top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) cv.rectangle(img2, top_left, bottom_right, 255, 2) # 画矩形 plt.subplot(121), plt.imshow(res, cmap='gray') plt.xticks([]), plt.yticks([]) # 隐藏坐标轴 plt.subplot(122), plt.imshow(img2, cmap='gray') plt.xticks([]), plt.yticks([]) plt.suptitle(meth) plt.show() #匹配多个对象 def cv_tm1(): img_rgb = cv.imread('D://m.png') img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY) template = cv.imread('D://m1.png', 0) h,w = template.shape[:2] res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED) threshold = 0.8 # 取匹配程度大于%80的坐标 loc = np.where(res >= threshold) for pt in zip(*loc[::-1]): # *号表示可选参数 bottom_right = (pt[0] + w, pt[1] + h) cv.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2) cv.imshow('img_rgb', img_rgb) cv.waitKey(0) img=cv.imread('D://z2.png') #cv_show('img',img) #print(img.shape) #cv_pyrUp(img) #cv_pyrDown(img) #cv_ud(img) #cv_la(img) #cv_contour1() #cv_contour2() #cv_contour3() #cv_contour4() #cv_tm() cv_tm1()
这篇关于基于python的opencv项目实战笔记(六)—— 图像金字塔与轮廓检测的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Python编程基础详解
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程