opencv 不同邊緣檢測算子效果比較

# -*- coding: utf-8 -*-
import cv2 as cv  
import numpy as np  
import matplotlib.pyplot as plt

#讀取圖像
img = cv.imread('d:/paojie.png')
img1 = cv.cvtColor(img, cv.COLOR_BGR2RGB)

#灰度化處理圖像
grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

#高斯濾波
gaussianBlur = cv.GaussianBlur(grayImage, (3,3), 0)

#閾值處理
ret, binary = cv.threshold(gaussianBlur, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)

#Roberts算子
kernelx = np.array([[-1,0],[0,1]], dtype=int)
kernely = np.array([[0,-1],[1,0]], dtype=int)
x = cv.filter2D(binary, cv.CV_16S, kernelx)
y = cv.filter2D(binary, cv.CV_16S, kernely)
absX = cv.convertScaleAbs(x)     
absY = cv.convertScaleAbs(y)    
Roberts = cv.addWeighted(absX, 0.5, absY, 0.5, 0)

#Prewitt算子
kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]], dtype=int)
kernely = np.array([[-1,0,1],[-1,0,1],[-1,0,1]], dtype=int)
x = cv.filter2D(binary, cv.CV_16S, kernelx)
y = cv.filter2D(binary, cv.CV_16S, kernely)
absX = cv.convertScaleAbs(x)  
absY = cv.convertScaleAbs(y)    
Prewitt = cv.addWeighted(absX,0.5,absY,0.5,0)

#Sobel算子
x = cv.Sobel(binary, cv.CV_16S, 1, 0)
y = cv.Sobel(binary, cv.CV_16S, 0, 1)    
absX = cv.convertScaleAbs(x)   
absY = cv.convertScaleAbs(y)    
Sobel = cv.addWeighted(absX, 0.5, absY, 0.5, 0)

#拉普拉斯算法
dst = cv.Laplacian(binary, cv.CV_16S, ksize = 3)
Laplacian = cv.convertScaleAbs(dst) 

#效果圖
titles = ['Source Image', 'Binary Image', 'Roberts Image',
          'Prewitt Image','Sobel Image', 'Laplacian Image']  
images = [img1, binary, Roberts, Prewitt, Sobel, Laplacian]  
for i in np.arange(6):  
   plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()  

代碼輸出輸出結果如圖所示。其中,Laplacian算子對噪聲比較敏感,由於其算法可能會出現雙像素邊界,常用來判斷邊緣像素位於圖像的明區或暗區,很少用於邊緣檢測;Robert算子對陡峭的低噪聲圖像效果較好,尤其是邊緣正負45度較多的圖像,但定位準確率較差;Prewitt算子對灰度漸變的圖像邊緣提取效果較好,而沒有考慮相鄰點的距離遠近對當前像素點的影響;Sobel算子考慮了綜合因素,對噪聲較多的圖像處理效果更好。

表示各種邊緣檢測算子
表示各種邊緣檢測算子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章