邊緣檢測 兩種方法實現

2021-10-09 22:49:07 字數 2454 閱讀 1166

import cv2

import numpy

from scipy import ndimage

def strokeedges(src,dst,blurksize,edgeksize):

src=numpy.array(src)

yuansrc=src

dst=numpy.array(dst)

if blurksize>=3:

blurredsrc=cv2.medianblur(src,blurksize)

graysrc=cv2.cvtcolor(blurredsrc,cv2.color_bgr2gray)

else:

graysrc=cv2.cvtcolor(blurksize,cv2.color_bgr2gray)

##以上操作是對模糊化然後邊緣灰化 是否模糊化的標準就是blurksize是否小於3

##cv2.laplacian(graysrc,cv2.cv_8u,graysrc,edgeksize)

##拉普拉斯演算法 第乙個引數是原圖 第二個引數是深度 也就是和形式有關例如 rgb分別由8位

##那麼深度就是2的24次方 這裡的cv2.cv_8u具體看下面

##第三個引數dest是結果的 ksize是核的大小 為奇數 (並不是數字越大或者越小就越好 這個好不好原因還未知)

#此時這裡的邊緣檢測已經是完成了

normalizedinversealpah=(1.0/255)*(255-graysrc)

channels=cv2.split(src)

#通道拆分

strokeedges(src,dst,7,5)

至於以上**是有兩個點如果你不認真看是不會發現的問題 第乙個 為什麼要用numpy.array陣列把影象二維化呢 第二個問題是為什麼再for迴圈裡明明沒有對channels(請注意這裡是channels)發生改變但是最後channels卻改變了呢

問題一的解答是在迴圈裡和strokeedges中的normalizedinversealpah=(1.0/255)*(255-graysrc)這個操作中對numpy陣列進行了運算 具體運算規則會在下面的**段中給出答案

問題二的解答也會在下面的**段中給出答案 如果我未來回頭複習或者讀者看這篇的時候麻煩敲一敲** 自己得出答案看看問題到底出現在**

cv2.destroyallwindows()canny函式本身並沒有對影象進行降噪操作 所以如果想要使用canny的話 必須提前使用低通道濾波去噪

cv2,canny中第乙個引數自然是 第二個第三個引數分別為上閾值和下閾值 簡單的理解就是數字小就會出現更多的邊緣但是同樣的風險是有可能會把噪音當成邊緣 或者出現了以下不是邊緣的邊緣 數字大就會邊緣少了 如果過大就會出現把邊緣當成不是邊緣

python中型別檢測的兩種方法

1.使用描述符 類的裝飾器 class typed def init self,key,type self.key key self.type type def get self,instance,owner return instance.dict self.key def set self,in...

LCA兩種方法

lca least common ancestors 即最近公共祖先,是指在有根樹中,找出某兩個結點u和v最近的公共祖先。模板題 anc i j 表示第i個點的2 j的祖先的標號 整個過程就是兩個點往上跳到同一深度,再一起往上跳找到lca include include using namespac...

post get 兩種方法

a.定義乙個get函式 get url,headers none defget url,headers none return urlrequests url,headers headers 內部可以呼叫urlrequests 如果不寫headers headers會被預設為none b.定義乙個p...