邊緣檢測 邊界框 最小矩形區域和最小閉圓的輪廓

2021-09-24 02:23:58 字數 3928 閱讀 2313

下面的所有示例使用均為如下:

所有繪圖函式都會修改源影象

邊緣檢測

opencv提供了許多邊緣檢測濾波函式,包括laplacian()sobel()以及scharr()。這些濾波函式都會將非邊緣區域轉化為黑色,邊緣區域轉化為白色或其他飽和的顏色(故在進行濾波畫線過後需要進行歸一化處理,將邊緣部分程式設計黑色,然後使用卷積核進行卷積尋找邊緣)。但是,這些函式都很容易將雜訊錯誤的識別為邊緣。緩解這個問題的方法是在找到邊緣前對影象進行模糊處理(降噪)。opencv也提供了許多用於模糊濾波函式,包括blur()(簡單的算術平均)、medianblur()(中位值模糊)以及gaussianblur()(高斯模糊)。邊緣檢測和模糊處理都有很多引數,但是他們都有乙個ksize引數,為奇數,表示濾波核的寬高。

降噪不管什麼訊號,或多或少都會引入雜訊,雜訊為小部分,但是全部都用均值降噪 勢必會造成影象模糊,只要是雜訊處理都會或多或少的造成模糊問題,中值濾波是使用選取中位置的方法進行濾波,如果雜訊是椒鹽雜訊(只有黑白二值),那麼中值濾波就可以達到很好的效果,因為雜訊一般都處於兩極,使用中值濾波可以很好的達到降噪的目的,但是如果是高斯雜訊分布(正態分佈),這個時候使用均值濾波的效果會更好

邊緣檢測過程:

先進行模糊處理進行降噪

將影象轉化為灰度圖

使用邊緣檢測濾波函式將邊緣轉化為白色或其他飽和顏色,非邊緣轉化為黑色

在進行歸一化處理,然後乘以源影象使原影象邊緣部分變黑

使用邊緣檢測卷積核進行卷積,產生白色邊緣

卷積核opencv定義的許多濾波函式都會使用核。核可以看作一組權重,他決定如何通過鄰近的點來計算新的畫素點。核也可以稱為卷積矩陣。卷積矩陣有奇數行、奇數列,感興趣的畫素對應於最中間個元素,其他元素對應於周圍其他鄰近的畫素點,有如下核:

kernel=numpy.array([[

-1,-

1,-1

],[-

1,9,

-1],

[-1,

-1,-

1]])

其中感興趣的畫素點的權重為9,周圍為0,對感興趣的畫素點*9減去8個相鄰的畫素點,如果卷積之前,感興趣的畫素點與周圍存在差異,經過卷積核處理過後差距會越來越來,就可以達到銳化的效果了

不同的核可以達到不同的有趣的效果,如權重和為0的卷積核可以達到檢測邊緣的目的。

卷積過程:

可以預先定義一些常用的卷積核備用

卷積方法

opencv使用filter2d()方法對影象與核做卷積矩陣

cv2.filter2d(src,-1

,kernel,dst)

第乙個引數為源影象,第二個引數指定目標影象每個通道的位深度(如,位深度cv2.cv_8u 表示每個通道8位),如果為-1表示與源影象相同,第三個引數為使用的卷積核,最後乙個引數為指向的目標影象。

對其做如下操作(需先使用邊緣檢測處理在做如下操作):

)結果:

canny邊緣檢測

opencv還提供了乙個非常方便的canny函式(以演算法發明人命名)進行邊緣檢測

#使用雙閾值去除假陽性

cv2.canny( image, edges, threshold1,threshold2, aperture_size=3)

;

輪廓檢測

主要使用opencv中的閾值處理函式(cv2.threshold)和查詢輪廓函式(cv2.findcontours)

在對影象查詢輪廓之前必須對影象進行二值化處理**化為只有黑白二值),使用threshold 函式處理

# 轉化為貴都影象

grayimage=cv2.cvtcolor(img.copy(

),cv2.color_bgr2gray)

# 黑白二值 大於127 的變為255,最後乙個引數為轉化為黑白二值

# 返回閾值,二值處理後的影象

ret,thread=cv2.threshold(grayimage,

127,

255,cv2.thresh_binary)

# 尋找輪廓,第二個引數代表檢測外輪廓,第三個引數指定使用的演算法

# 返回值 輪廓,層級

# 層級代表各輪廓之間的關係

for c in contours:

# 尋找邊界矩形

x,y,w,h=cv2.boundingrect(c)

cv2.rectangle(img,

(x,y)

,(x+w,y+h),(

0,255,0)

)#最小矩形輪廓

rect=cv2.minarearect(c)

box=cv2.boxpoints(rect)

box=np.int0(box)

cv2.drawcontours(img,

[box],0

,(0,

0,255),1

)#最小圓形輪廓

(x,y)

,radius=cv2.minenclosingcircle(c)

center=

(int

(x),

int(y)

) radius=

int(radius)

cv2.circle(img,center,radius,

(255,0

,0),

1)# 畫輪廓 在img上 第三個引數為-1代表畫所有輪廓,其餘值代表相應的輪廓

# 第三個值為輪廓顏色 本例子中使用了綠色

# 第四個引數代表畫輪廓的線寬

cv2.drawcontours(img,contours,-1

,(255,

255,0)

)cv2.imshow(

'findedge'

,img)

cv2.waitkey(

)cv2.destroyallwindows(

)結果:

說明:藍色:最小閉圓輪廓

綠色:邊界矩形

紅色:最小矩形輪廓

淺藍色:輪廓

邊界框回歸

原 置頂2017年08月31日 22 38 05 南有喬木ntu 閱讀數 73169 目標檢測演算法 更多 分類專欄 目標檢測 最近一直看檢測有關的 從rcnn,fast rcnn,faster rcnn,yolo,r fcn,ssd,到今年cvpr最新的yolo9000。這些 中損失函式都包含了邊...

Canny邊緣檢測

1.canny邊緣檢測基本原理 1 圖象邊緣檢測必須滿足兩個條件 一能有效地抑制雜訊 二必須盡量精確確定邊緣的位置。2 根據對訊雜比與定位乘積進行測度,得到最優化逼近運算元。這就是canny邊緣檢測運算元。3 類似與marr log 邊緣檢測方法,也屬於先平滑後求導數的方法。2.canny邊緣檢測演...

Canny邊緣檢測

canny運算元是邊緣檢測運算元中最常用的一種,是公認效能優良的一種運算元,常被其它邊緣檢測運算元作為標準運算元進行優劣分析。canny演算法基本可以分為3個步驟 平滑 梯度計算 基於梯度值及梯度方向的候選點過濾 1 平滑 影象梯度的計算對雜訊很敏感,因此必須首先對其進行低通濾波。在這裡使用5 5的...