Python+OpenCV實現邊緣檢測與角點檢測詳解
一、邊緣檢測

Sobel與Canny邊緣檢測代碼如下所示
import cv2 as cv import matplotlib.pyplot as plt
1.1、讀取圖像
讀取圖像的代碼如下所示
# 讀取圖像
img = cv.imread('Lena.jpg')
lenna_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
1.2、圖像轉換成灰度圖像
圖像轉換成灰度圖像的代碼如下所示
# 圖像轉換成灰度圖像 grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
1.3、Sobel算子
Sobel算子的代碼如下所示
'''
Sobel算子
'''
x = cv.Sobel(grayImage, cv.CV_16S, 1, 0) # 對x求一階導數
y = cv.Sobel(grayImage, cv.CV_16S, 0, 1) # 對y求一階導數
absX = cv.convertScaleAbs(x)
absY = cv.convertScaleAbs(y)
Sobel = cv.addWeighted(absX, 0.5, absY, 0.5, 0)
1.4、Canny算子
Canny算子的代碼如下所示
'''
Canny算子
'''
# 高斯濾波降噪
gaussian = cv.GaussianBlur(grayImage, (3, 3), 0)
# Canny算子
Canny = cv.Canny(gaussian, 50, 100)
1.5、顯示正常中文的標簽
顯示正常中文的標簽的代碼如下所示
# 顯示正常中文的標簽
plt.rcParams['font.sans-serif'] = ['SimHei']
titles = [u'(a)原始圖像', u'(b)Sobel圖像', u'(c)Canny圖像']
images = [lenna_img, Sobel, Canny]
for i in range(3):
plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
1.6、邊緣檢測結果
邊緣檢測運行結果結果如下所示

Sobel與Canny邊緣檢測的優(yōu)缺點
sobel:
1、sobel優(yōu)點:輸出圖像(數組)的元素通常具有更大的絕對數值。
2、sobel缺點:由于邊緣是位置的標志,對灰度的變化不敏感。
canny:
1、canny優(yōu)點:法能夠盡可能多地標識出圖像中的實際邊緣;標識出的邊緣要與實際圖像中的實際邊緣盡可能接近。
2、canny缺點:圖像中的邊緣只能標識一次,并且可能存在的圖像噪聲不應標識為邊緣。
二、角點檢測

Susan與Harris角點檢測代碼如下所示
import cv2 as cv import numpy as np import matplotlib.pyplot as plt
2.1、讀取圖像
讀取圖像的代碼如下所示
# 讀取圖像
img = cv.imread('Lena.jpg')
lenna_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
2.2、圖像轉換成灰度圖像
圖像轉換成灰度圖像的代碼如下所示
# 圖像轉換成灰度圖像 grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY) grayImage = np.float32(grayImage)
2.3、Harris算子
Harris算子的代碼如下所示
'''
Harris算子
'''
harrisImage = cv.cornerHarris(grayImage, 2, 3, 0.04)
harrisImage = cv.dilate(harrisImage, None)
2.4、設置閾值
設置閾值的代碼如下所示
# 設置閾值 thresImage = 0.006 * harrisImage.max() img[harrisImage > thresImage] = [255, 0, 0]
2.5、Susan算子
Susan算子的代碼如下所示
'''
Susan算子
'''
def img_extraction(image):
"""
img_extraction 函數利用susan角點檢測算法,對圖像進行處理
"""
print("最小灰度值,%d" % image.min())
print("最大灰度值,%d" % image.max())
threshold_value = (int(image.max())-int(image.min())) / 10
print("初始閾值為: %d" % threshold_value)
offsetX = [
-1, 0, 1,
-2, -1, 0, 1, 2,
-3, -2, -1, 0, 1, 2, 3,
-3, -2, -1, 0, 1, 2, 3,
-3, -2, -1, 0, 1, 2, 3,
-2, -1, 0, 1, 2,
-1, 0, 1
]
offsetY = [
-3, -3, -3,
-2, -2, -2, -2, -2,
-1, -1, -1, -1, -1, -1, -1,
0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2,
3, 3, 3
]
for i in range(3, image.shape[0] - 3): # 利用圓形模板遍歷圖像,計算每點處的USAN值
for j in range(3, image.shape[1] - 3):
same = 0
for k in range(0, 37):
if abs(int(image[i + int(offsetY[k]), j + int(offsetX[k]), 0]) - int(image[i, j, 0])) < threshold_value: # 計算相似度
same += 1
if same < 18:
image[i, j, 0] = 18 - same
image[i, j, 1] = 18 - same
image[i, j, 2] = 18 - same
else:
image[i, j, 0] = 0
image[i, j, 1] = 0
image[i, j, 2] = 0
return image
def img_revise(image):
"""
img_revise 函數用于對角點處理后的圖像,進行非極大值抑制修正
"""
X = [-1, -1, -1, 0, 0, 1, 1, 1] # X軸偏移
Y = [-1, 0, 1, -1, 1, -1, 0, 1] # Y軸偏移
for i in range(4, image.shape[0]-4):
for j in range(4, image.shape[1]-4):
flag = 0
for k in range(0, 8):
print(i)
if image[i, j, 0] <= image[int(i + X[k]), int(j + Y[k]), 0]:
flag += 1
break
if flag == 0: # 判斷是否是周圍8個點中最大的值,是則保留
image[i, j, 0] = 255
image[i, j, 1] = 255
image[i, j, 2] = 255
else:
image[i, j, 0] = 0
image[i, j, 1] = 0
image[i, j, 2] = 0
return image
originImage = cv.imread('Lena.jpg')
originImage = cv.cvtColor(originImage, cv.COLOR_BGR2RGB)
2.6、圖像轉換成灰度圖像
圖像轉換成灰度圖像的代碼如下所示
# 圖像轉換成灰度圖像 grayImage = np.float32(originImage)
2.7、調用susan角點檢測算法
調用susan角點檢測算法的代碼如下所示
# 調用susan角點檢測算法 extraImage = img_extraction(originImage)
2.8、調用img_revise()非極大值抑制修正
調用img_revise()非極大值抑制修正的代碼如下所示
# 調用img_revise()非極大值抑制修正 susanImages = img_revise(extraImage)
2.9、顯示正常中文的標簽
顯示正常中文的標簽的代碼如下所示
# 顯示正常中文的標簽
plt.rcParams['font.sans-serif'] = ['SimHei']
titles = [u'(a)原始圖像', u'(b)Harris圖像', u'(c)Susan圖像']
images = [lenna_img, img, susanImages]
for i in range(3):
plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
2.10、角點檢測結果
角點檢測運行結果結果如下所示

Susan與Harris角點檢測算子的優(yōu)缺點
Harris:
Harris優(yōu)點:
1 旋轉不變性,橢圓轉過一定角度但是其形狀保持不變(特征值保持不變)
2 對于圖像灰度的仿射變化具有部分的不變性,由于僅僅使用了圖像的一介導數,對于圖像灰度平移變化不變;對于圖像灰度尺度變化不變
Harris缺點:
1 對尺度很敏感,不具備幾何尺度不變性。
2 提取的角點是像素級的
Susan:
Susan優(yōu)點:大多數的邊緣檢測算子會隨所用模板尺寸的變化而改變其所檢測出的邊緣的位置,但SUSAN檢測算子能提供不依賴于模板尺寸的邊緣精度。
以上就是Python+OpenCV實現邊緣檢測與角點檢測詳解的詳細內容,更多關于Python OpenCV邊緣 角點檢測的資料請關注腳本之家其它相關文章!
相關文章
Python實現批量讀取圖片并存入mongodb數據庫的方法示例
這篇文章主要介紹了Python實現批量讀取圖片并存入mongodb數據庫的方法,涉及Python文件讀取及數據庫寫入相關操作技巧,需要的朋友可以參考下2018-04-04
python學習筆記之列表(list)與元組(tuple)詳解
List(列表)是Python中使用最頻繁的數據類型,而元組是另一個數據類型,類似于List(列表)。這篇文章主要給大家介紹了python學習筆記之列表(list)與元組(tuple)的相關資料,文中不僅詳細介紹了兩者的使用,還分享了list和tuple的相互轉換的方法,需要的朋友可以參考下2017-11-11
Python日期與時間模塊(datetime+time+Calendar+dateuil?)相關使用講解
這篇文章主要介紹了Python日期與時間模塊(datetime+time+Calendar+dateuil?)相關使用講解,文章圍繞主題展開詳細的內容戒殺,具有一定的參考價值,需要的朋友可以參考一下2022-09-09
Python多線程爬蟲實戰(zhàn)_爬取糗事百科段子的實例
下面小編就為大家分享一篇Python多線程爬蟲實戰(zhàn)_爬取糗事百科段子的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12

