重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
摘要:圖像銳化和邊緣提取技術可以消除圖像中的噪聲,提取圖像信息中用來表征圖像的一些變量,為圖像識別提供基礎。
本文分享自華為云社區《[Python圖像處理] 十七.圖像銳化與邊緣檢測之Roberts算子、Prewitt算子、Sobel算子和Laplacian算》,作者: eastmount 。
成都創新互聯公司致力于互聯網品牌建設與網絡營銷,包括做網站、成都做網站、SEO優化、網絡推廣、整站優化營銷策劃推廣、電子商務、移動互聯網營銷等。成都創新互聯公司為不同類型的客戶提供良好的互聯網應用定制及解決方案,成都創新互聯公司核心團隊10年專注互聯網開發,積累了豐富的網站經驗,為廣大企業客戶提供一站式企業網站建設服務,在網站建設行業內樹立了良好口碑。
由于收集圖像數據的器件或傳輸數圖像的通道的存在一些質量缺陷,文物圖像時間久遠,或者受一些其他外界因素、動態不穩定抓取圖像的影響,使得圖像存在模糊和有噪聲的情況,從而影響到圖像識別工作的開展。這時需要開展圖像銳化和邊緣檢測處理,加強原圖像的高頻部分,銳化突出圖像的邊緣細節,改善圖像的對比度,使模糊的圖像變得更清晰。
圖像銳化和邊緣提取技術可以消除圖像中的噪聲,提取圖像信息中用來表征圖像的一些變量,為圖像識別提供基礎。通常使用灰度差分法對圖像的邊緣、輪廓進行處理,將其凸顯。本文分別采用Laplacian算子、Robert算子、Prewitt算子和Sobel算子進行圖像銳化邊緣處理實驗。本文主要講解灰度線性變換,基礎性知識希望對您有所幫助。
該系列在github所有源代碼:https://github.com/eastmountyxz/ImageProcessing-Python
Roberts算子又稱為交叉微分算法,它是基于交叉差分的梯度算法,通過局部差分計算檢測邊緣線條。常用來處理具有陡峭的低噪聲圖像,當圖像邊緣接近于正45度或負45度時,該算法處理效果更理想。其缺點是對邊緣的定位不太準確,提取的邊緣線條較粗。
Roberts算子的模板分為水平方向和垂直方向,如公式(11.7)所示,從其模板可以看出,Roberts算子能較好的增強正負45度的圖像邊緣。
詳細計算公式如下所示:(PS-下圖參考自己的書和論文)
在Python中,Roberts算子主要通過Numpy定義模板,再調用OpenCV的filter2D()函數實現邊緣提取。該函數主要是利用內核實現對圖像的卷積運算,其函數原型如下所示:
dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
Python實現代碼如下所示:
# -*- coding: utf-8 -*- import cv2 import numpyas np import matplotlib.pyplotas plt #讀取圖像 img= cv2.imread('lena.png') lenna_img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #灰度化處理圖像 grayImage= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Roberts算子 kernelx= np.array([[-1,0],[0,1]], dtype=int) kernely= np.array([[0,-1],[1,0]], dtype=int) x= cv2.filter2D(grayImage, cv2.CV_16S, kernelx) y= cv2.filter2D(grayImage, cv2.CV_16S, kernely) #轉uint8 absX= cv2.convertScaleAbs(x) absY= cv2.convertScaleAbs(y) Roberts= cv2.addWeighted(absX,0.5,absY,0.5,0) #用來正常顯示中文標簽 plt.rcParams['font.sans-serif']=['SimHei'] #顯示圖形 titles= [u'原始圖像', u'Roberts算子'] images= [lenna_img, Roberts] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()