cv2.threshold(src, thresh, maxval, type[, dst]) #進(jìn)行閾值處理0-255,0表示黑,255表示白
1 src:表示的是圖片源
2 thresh:表示的是閾值(起始值)
3 maxval:表示的是最大值
4 type:表示的是這里劃分的時(shí)候使用的是什么類型的算法,常用值為0(cv2.THRESH_BINARY)
它一般返回兩個(gè)值,第一個(gè)值是輸入的閾值,第二個(gè)值是處理后的圖像

一般的(BINARY)效果是:
將一個(gè)灰色的圖片,變成要么是白色要么就是黑色。(大于規(guī)定thresh值就是設(shè)置的最大值(常為255,也就是白色))
cv2.cvtColor(p1,p2) 是顏色空間轉(zhuǎn)換函數(shù),p1是需要轉(zhuǎn)換的圖片,p2是轉(zhuǎn)換成何種格式。
cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
第一個(gè)參數(shù)是指明在哪幅圖像上繪制輪廓;image為三通道才能顯示輪廓
第二個(gè)參數(shù)是輪廓本身,在Python中是一個(gè)list;
第三個(gè)參數(shù)指定繪制輪廓list中的哪條輪廓,一般默認(rèn)是-1,則繪制其中的所有輪廓。后面的參數(shù)很簡(jiǎn)單。其中thickness表明輪廓線的寬度,如果是-1(cv2.FILLED),則為填充模式。
輪廓特征
cv2.contourArea(cnt, True)?# 計(jì)算輪廓的面積
?cnt:輸入的單個(gè)輪廓值
輪廓近似

cv2.approxPolyDP( InputArray curve,OutputArray approxCurve,double epsilon, bool closed )
InputArray curve:輸入曲線,數(shù)據(jù)類型可以為vector<Point>。
OutputArray approxCurve:輸出折線,數(shù)據(jù)類型可以為vector<Point>。
double epsilon:判斷點(diǎn)到相對(duì)應(yīng)的line segment 的距離的閾值。(距離大于此閾值則舍棄,小于此閾值則保留,epsilon越小,折線的形狀越“接近”曲線。)
bool closed:曲線是否閉合的標(biāo)志位。
邊界矩形
cv2.boundingRect(img) #img是個(gè)二值圖,就是它的參數(shù);返回4個(gè)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?值,分別是x,y,z,w;x,y是矩陣左上點(diǎn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?的高,w,h是矩陣的寬和高然后利用cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2) 畫(huà)出矩行
外接圓
center, radius = cv.minEnclosingCircle( points )
center:返回值,圓的中心
radius:返回值,半徑
points:目標(biāo)物體的點(diǎn)
模板匹配
模板匹配和卷積原理很像,模板在原圖像上從原點(diǎn)開(kāi)始滑動(dòng),計(jì)算模板與(圖像被模板覆蓋的地方)的差別程度。這個(gè)差別程度的計(jì)算方法在opencv中有6中,然后將每次計(jì)算的結(jié)果放入一個(gè)矩陣?yán)?,作為結(jié)果輸出。假如原圖形是AxB,而模板是axb大小,則輸出的結(jié)果是矩陣(A-a+1)x(B-b+1)
圖像特征-harris角點(diǎn)檢測(cè)

基本原理






R>0,是角點(diǎn)
R近似=0,平坦
R<0,是邊界
cv2.cornerHarris()
img:數(shù)據(jù)類型為float32的入圖像
blockSize:角點(diǎn)檢測(cè)中指定區(qū)域的大小
ksize:Sobel求導(dǎo)中使用的窗口大小
k:取值參數(shù)[0.04,0.06]
Scale Invariant Feature Transform(SIFT)——平移不變性圖像特征變換
一 圖像尺度空間
在一定的范圍內(nèi),無(wú)論物體是大還是小,人眼都可以分辨出來(lái),然而計(jì)算機(jī)要有相同的能力很難。所以要讓機(jī)器能夠?qū)ξ矬w在不同尺度下有一個(gè)統(tǒng)一的認(rèn)知,就需要考慮圖像在不同尺度下都存在的特點(diǎn)
尺度空間的獲取通常使用高斯模糊來(lái)實(shí)現(xiàn)

我們并不希望高斯模板一成不變,而是希望它可以通過(guò)一些參數(shù)進(jìn)行調(diào)整以適應(yīng)不同的情況,故我們不采用標(biāo)準(zhǔn)正態(tài)分布來(lái)計(jì)算模板,而是保留σ的可變性,用于調(diào)整模板的頻帶寬度進(jìn)而影響圖像被處理后的平滑(模糊)程度。
多分辨圖像金字塔

高斯差分金字塔



關(guān)鍵點(diǎn)的精確定位
這些候選關(guān)鍵點(diǎn)是DOG空間的局部極值點(diǎn),而且這些極值點(diǎn)均為離散的點(diǎn),精確定位極值點(diǎn)是一種方法是,對(duì)尺度空間DOG函數(shù)進(jìn)行曲線擬合,計(jì)算其極值點(diǎn),從而實(shí)現(xiàn)關(guān)鍵點(diǎn)的精確定位


消除邊界響應(yīng)

特征點(diǎn)的主方向

每個(gè)特征點(diǎn)都可以得到三個(gè)信息(x,y,z,
生成特征描述
在完成關(guān)鍵點(diǎn)的梯度計(jì)算后,使用直方圖統(tǒng)計(jì)鄰域內(nèi)像素的梯度和方向

為了保證特征矢量的旋轉(zhuǎn)不變性,要以特征點(diǎn)為中心,在附近鄰域內(nèi)將坐標(biāo)軸旋轉(zhuǎn)
角度,即將坐標(biāo)軸旋轉(zhuǎn)為特征點(diǎn)的主方向。

旋轉(zhuǎn)之后的主方向?yàn)橹行娜?x8的窗口,求每個(gè)像素的梯度幅值和方向,箭頭方向代表梯度方向,長(zhǎng)度代表梯度幅值,然后利用高斯窗口對(duì)其進(jìn)行加權(quán)運(yùn)算,最后在每個(gè)4x4的小塊上繪制8個(gè)方向的梯度直方圖,計(jì)算每個(gè)梯度方向的累加值,即可形成一個(gè)種子點(diǎn),即每個(gè)特征的由4個(gè)種子點(diǎn)組成,每個(gè)種子點(diǎn)有8個(gè)方向的向量信息。

建議對(duì)每個(gè)關(guān)鍵點(diǎn)使用4x4共16個(gè)種子點(diǎn)來(lái)描述,這樣一個(gè)關(guān)鍵點(diǎn)就會(huì)產(chǎn)生128維的SIFT特征圖像

圖像平滑處理

cv2.blur(img,ksize)
img:原圖像
ksize:核大小
原理:它只取內(nèi)核區(qū)域下所有像素的平均值并替換中心元素。3x3標(biāo)準(zhǔn)化的盒式過(guò)濾器如下所示:

特征:核中區(qū)域貢獻(xiàn)率相同。
作用:對(duì)于椒鹽噪聲的濾除效果比較好。
?cv2.boxfilter(img, -1, (3, 3), normalize=True) 表示進(jìn)行方框?yàn)V波,參數(shù)說(shuō)明當(dāng)normalize=True時(shí),與均值濾波結(jié)果相同, normalize=False,表示對(duì)加和后的結(jié)果不進(jìn)行平均操作,大于255的使用255表示
cv2.Guassianblur(img, (3, 3), 1) 表示進(jìn)行高斯濾波,?
參數(shù)說(shuō)明: 1表示σ, x表示與當(dāng)前值得距離,計(jì)算出的G(x)表示權(quán)重值

距離中心點(diǎn)越近,權(quán)值越高。
cv2.medianBlur(img, 3) #中值濾波,相當(dāng)于將9個(gè)值進(jìn)行排序,取中值作為當(dāng)前值
參數(shù)說(shuō)明:img表示當(dāng)前的圖片,3表示當(dāng)前的方框尺寸
形態(tài)學(xué)-腐蝕操作
cv2.erode(pie,kernel,iterations = 1)
參數(shù):原圖、核、迭代次數(shù),次數(shù)越多,腐蝕的越厲害
#在原圖的每一個(gè)小區(qū)域里取最小值,由于是二值化圖像,只要有一個(gè)點(diǎn)為0,則都為0,來(lái)達(dá)到瘦身的目的。因此在下面的例子中,我們就可以使用腐蝕來(lái)將圖片中的一些毛刺或者說(shuō)很細(xì)小的東西給去掉。
形態(tài)學(xué)-膨脹操作
cv2.dilate(dige_erosion,kernel,iterations = 1
開(kāi)運(yùn)算與閉運(yùn)算
cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) #開(kāi)運(yùn)算,先腐蝕,再膨脹
cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#閉運(yùn)算,先膨脹,再腐蝕
梯度運(yùn)算
cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel) #腐蝕-膨脹
禮帽與黑帽
????禮帽=原始輸入-開(kāi)運(yùn)算結(jié)果?
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
????黑帽=閉運(yùn)算-原始輸入
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
圖像梯度-Sobel算子

分別表示在水平方向和垂直方向上的梯度的變化,即用于邊緣的檢測(cè)
dst = cv2.Sobel(src,ddepth,dx,dy,ksize)
? ? ddepth:圖像的深度
? ? dx和dy分別表示水平和豎直方向
? ?ksize是sobel算子的大小
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
注意:從白到黑是整數(shù),黑到白就是負(fù)數(shù)了,所有的負(fù)數(shù)會(huì)被截?cái)喑?,所以要取絕對(duì)值
cv2.convertScaleAbs(img)??
取絕對(duì)值,并將梯度圖像轉(zhuǎn)換成256色位圖,轉(zhuǎn)換為unit8類型
cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.addWeighted(圖像1src1,系數(shù)1,圖像2src2,系數(shù)2,修正系數(shù)gamma)
圖像梯度-Scharr算子

圖像梯度-laplacian算子

scharr算子對(duì)邊界更敏感?