下面的所有示例使用均為如下:
所有繪圖函式都會修改源影象邊緣檢測
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的...