目錄
- 1. 效果圖
- 2. 源碼
- 補(bǔ)充:OpenCV-Python 中 Canny() 參數(shù)
這篇博客將介紹Canny邊緣檢測的概念,并利用cv2.Canny()實現(xiàn)邊緣檢測;
- Canny邊緣檢測是一種流行的邊緣檢測算法。它是由約翰F開發(fā)的,是一個多階段的算法;
- Canny邊緣檢測大致包含4個步驟:
- 降噪(使用高斯濾波去除高頻噪聲);
- 計算邊緣梯度和方向(SobelX、SobleY核在水平方向和垂直方向?qū)ζ交蟮膱D像進(jìn)行濾波,找到每個像素的邊緣梯度和方向);
- 非最大抑制(在得到梯度大小和方向后,對圖像進(jìn)行全掃描,去除任何不需要的像素,這些像素可能不構(gòu)成邊緣。檢查像素是否在其梯度方向的鄰域中是局部最大值。否則,將被抑制(歸零)。簡而言之,得到的結(jié)果是一個具有“細(xì)邊”的二值圖像。
- 滯后閾值(決定哪些邊是真正的邊,哪些不是。為此需要兩個閾值minVal和maxVal,任何強(qiáng)度梯度大于maxVal的邊都肯定是邊,小于minVal的邊肯定是非邊,因此丟棄。位于這兩個閾值之間的邊根據(jù)其連通性被分類為邊或非邊。如果它們連接到“確定邊緣”像素,則它們被視為邊緣的一部分。否則,它們也會被丟棄。)
選擇滯后閾值minVal和maxVal是得到正確結(jié)果的關(guān)鍵。
1. 效果圖
原始圖 VS Canny檢測效果圖如下:
2. 源碼
# Canny邊緣檢測是一種流行的邊緣檢測算法。它是由約翰F開發(fā)的,是一個多階段的算法;
# Canny邊緣檢測大致包含4個步驟:
#
# 1.降噪(使用高斯濾波去除高頻噪聲);
# 2. 計算邊緣梯度和方向(SobelX、SobleY核在水平方向和垂直方向?qū)ζ交蟮膱D像進(jìn)行濾波,找到每個像素的邊緣梯度和方向);
# 3. 非最大抑制(在得到梯度大小和方向后,對圖像進(jìn)行全掃描,去除任何不需要的像素,這些像素可能不構(gòu)成邊緣。檢查像素是否在其梯度方向的鄰域中是局部最大值。否則,將被抑制(歸零)。簡而言之,得到的結(jié)果是一個具有“細(xì)邊”的二值圖像。
# 4. 滯后閾值(決定哪些邊是真正的邊,哪些不是。為此需要兩個閾值minVal和maxVal,任何強(qiáng)度梯度大于maxVal的邊都肯定是邊,小于minVal的邊肯定是非邊,因此丟棄。位于這兩個閾值之間的邊根據(jù)其連通性被分類為邊或非邊。如果它們連接到“確定邊緣”像素,則它們被視為邊緣的一部分。否則,它們也會被丟棄。)
#
# 選擇滯后閾值minVal和maxVal是得到正確結(jié)果的關(guān)鍵。
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('zly.jpg', 0)
edges = cv2.Canny(img, 80, 200)
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
參考 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_canny/py_canny.html#canny
補(bǔ)充:OpenCV-Python 中 Canny() 參數(shù)
步驟:
- 彩色圖像轉(zhuǎn)換為灰度圖像(以灰度圖或者單通道圖讀入)
- 對圖像進(jìn)行高斯模糊(去噪)
- 計算圖像梯度,根據(jù)梯度計算圖像邊緣幅值與角度
- 沿梯度方向進(jìn)行非極大值抑制(邊緣細(xì)化)
- 雙閾值邊緣連接處理
- 二值化圖像輸出結(jié)果
"""
cv2.Canny(image, # 輸入原圖(必須為單通道圖)
threshold1,
threshold2, # 較大的閾值2用于檢測圖像中明顯的邊緣
[, edges[,
apertureSize[, # apertureSize:Sobel算子的大小
L2gradient ]]]) # 參數(shù)(布爾值):
true: 使用更精確的L2范數(shù)進(jìn)行計算(即兩個方向的倒數(shù)的平方和再開放),
false:使用L1范數(shù)(直接將兩個方向?qū)?shù)的絕對值相加)。
"""
import cv2
import numpy as np
original_img = cv2.imread("qingwen.png", 0)
# canny(): 邊緣檢測
img1 = cv2.GaussianBlur(original_img,(3,3),0)
canny = cv2.Canny(img1, 50, 150)
# 形態(tài)學(xué):邊緣檢測
_,Thr_img = cv2.threshold(original_img,210,255,cv2.THRESH_BINARY)#設(shè)定紅色通道閾值210(閾值影響梯度運(yùn)算效果)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) #定義矩形結(jié)構(gòu)元素
gradient = cv2.morphologyEx(Thr_img, cv2.MORPH_GRADIENT, kernel) #梯度
cv2.imshow("original_img", original_img)
cv2.imshow("gradient", gradient)
cv2.imshow('Canny', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
可調(diào)整閾值大小的程序
import cv2
import numpy as np
def CannyThreshold(lowThreshold):
detected_edges = cv2.GaussianBlur(gray,(3,3),0)
detected_edges = cv2.Canny(detected_edges,
lowThreshold,
lowThreshold*ratio,
apertureSize = kernel_size)
dst = cv2.bitwise_and(img,img,mask = detected_edges) # just add some colours to edges from original image.
cv2.imshow('canny demo',dst)
lowThreshold = 0
max_lowThreshold = 100
ratio = 3
kernel_size = 3
img = cv2.imread('qingwen.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.namedWindow('canny demo')
cv2.createTrackbar('Min threshold','canny demo',lowThreshold, max_lowThreshold, CannyThreshold)
CannyThreshold(0) # initialization
if cv2.waitKey(0) == 27:
cv2.destroyAllWindows()
到此這篇關(guān)于Python實現(xiàn)Opencv cv2.Canny()邊緣檢測的文章就介紹到這了,更多相關(guān)Opencv cv2.Canny()邊緣檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python OpenCV實現(xiàn)邊緣檢測
- OpenCV中Canny邊緣檢測的實現(xiàn)
- 使用Python中OpenCV和深度學(xué)習(xí)進(jìn)行全面嵌套邊緣檢測
- OpenCV實現(xiàn)灰度、高斯模糊、邊緣檢測的示例
- Python使用Opencv實現(xiàn)邊緣檢測以及輪廓檢測的實現(xiàn)
- 如何利用Python 進(jìn)行邊緣檢測
- python實現(xiàn)canny邊緣檢測
- OpenCV半小時掌握基本操作之邊緣檢測