OpenCV3計算機視覺 Python語言實現(3)
空間金字塔
對一幅圖像的解析度進行調整,高解析度的圖像在下層,低解析度的圖像在上層
有兩種金字塔:高斯金字塔和拉普拉斯金字塔。
高斯金字塔的頂部是通過將底部圖像中的連續的行和列去除得到的,頂部圖像中的每個像素值等於下一層圖像中 5 個像素的高斯加權平均值。這樣操作一次一個 MxN 的圖像就變成了一個 M/2xN/2 的圖像。所以這幅圖像的面積就變為原來圖像面積的四分之一,這被稱為Octave。連續進行這樣的操作我們就會得到一個解析度不斷下降的圖像金字塔。使用函數v2.pyrDown() 和 cv2.pyrUp() 構建圖像金字塔。
拉普拉斯金字塔由高斯金字塔組成
import cv2import pylab as plim = cv2.imread(screenshot.png)im_py=[im]for i in range(0,3): im_temp = cv2.pyrDown(im_py[i]) im_py.append(im_temp) print im_temp.shape#每個高層金字塔是底層解析度的1/2pl.subplot(1,3,1)pl.imshow(cv2.cvtColor(im_py[0],cv2.COLOR_BGR2RGB))pl.subplot(1,3,2)pl.imshow(cv2.cvtColor(im_py[1],cv2.COLOR_BGR2RGB))pl.subplot(1,3,3)pl.imshow(cv2.cvtColor(im_py[2],cv2.COLOR_BGR2RGB))pl.show()
拉普拉斯金字塔
im_la = [im]for i in range(0,3): im_temp = im_py[i]-cv2.pyrUp(im_py[i+1]) im_la.append(im_temp)pl.subplot(1,3,1)pl.imshow(cv2.cvtColor(im_la[0],cv2.COLOR_BGR2RGB))pl.subplot(1,3,2)pl.imshow(cv2.cvtColor(im_la[1],cv2.COLOR_BGR2RGB))pl.subplot(1,3,3)pl.imshow(cv2.cvtColor(im_la[2],cv2.COLOR_BGR2RGB))pl.show()
輪廓檢測
import cv2import numpy as npimg = cv2.pyrDown(cv2.imread(demo.jpg,cv2.IMREAD_UNCHANGED))ret,thresh = cv2.threshold(cv2.cvtColor(img.copy(),cv2.COLOR_BGR2GRAY),127,255,cv2.THRESH_BINARY)#得到輪廓contours列表image,contours,hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for c in contours: #依據某一個輪廓計算出簡單的矩形邊框,也可以直接使用一個二值圖像作為輸入 x,y,w,h = cv2.boundingRect(c) #在img上繪製矩形,左上角坐標以及右下角坐標 #用矩形將形狀包裹起來 cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) #計算出包圍目標輪廓的最小矩形區域 #首先依據輪廓得到最小矩形 #注意這個矩形是有角度的(即為有旋轉角度的矩形框架) #函數cv2.minAreaRect返回的是一個 Box2D 結構,其中包含 #矩形左上角角點的坐標(x,y),矩形的寬和高(w,h),以及旋轉角度 rect = cv2.minAreaRect(c) #依據矩形rect得到頂點,注意頂點是float類型 box = cv2.boxPoints(rect) #使用np進行格式轉換 box = np.int8(box) #繪製輪廓 #drawContours能夠繪製參數二的一系列輪廓;第三個參數為參數二列表的索引,-1為所有 cv2.drawContours(img,[box],0,(0,0,255),2) #得到輪廓c的最小閉圓 (x,y),radius = cv2.minEnclosingCircle(c) center = (int(x),int(y)) radius = int(radius) #繪製圓 img = cv2.circle(img,center,radius,(0,255,0),2) cv2.drawContours(img,contours,-1,(255,0,0),1)cv2.imshow(contouts,img)
凸輪廓與Douglas-Peucker演算法
使用approxPloyDP計算近似的多邊形框
參數一為輪廓
參數二表示源輪廓與近似多邊形的最大差值
參數三表示這個多邊形是否閉合
輪廓的周長信息 cv2.arcLength(cnt,True)
cv2.convexHull 獲取處理過的輪廓信息
直線檢測和圓檢測
使用cv的HoughLinesP函數
import cv2import numpy as npimg = cv2.imread(lines.jpg)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)edges = cv2.Canny(gray,50,120)minLineLength = 20maxLineGap = 5#HoughLinesP接收一般由Canny檢測器處理過的單通道二值圖像lines = cv2.HoughLinesP( edges,1,np.pi/180,100,minLineLength,maxLineGap)lines_list = lines.tolist()#繪製直線for [[x1,y1,x2,y2]] in lines_list: cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)cv2.imshow(edge,edges)cv2.imshow(lines,img)cv2.waitKey()cv2.destroyAllWindows()
使用cv的HoughCircles函數
import cv2import numpy as npplanets = cv2.imread(demo.jpg)gray_img = cv2.cvtColor(planets,cv2.COLOR_BGR2GRAY)img = cv2.medianBlur(gray_img,5)cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,120, param1=100,param2=30, minRadius=0,maxRadius=0)circles = np.uint16(np.around(circles))for i in circles[0,:]: cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2) cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)cv2.imwrite(demo,planets)cv2.imshow(ded,planets)cv2.waitKey()cv2.destroyAllWindows()
推薦閱讀:
※TENSORFLOW 資源大全–中文版
※一文掌握 Python 異常處理的所有知識點
※過去一年裡有30個驚人的Python項目
※【人生苦短,我用Python】Python免費精品課連載(3)——函數與遞歸
※【廣告】關於自學Python相關的Live
TAG:Python |

