OpenCV系列(七)邊緣提取

2021-03-02 深度學習從入門到放棄

邊緣提取,指數字圖像處理中,對於圖片輪廓的一個處理。對於邊界處,灰度值變化比較劇烈的地方,就定義為邊緣。也就是拐點,拐點是指函數發生凹凸性變化的點。二階導數為零的地方。並不是一階導數,因為一階導數為零,表示是極值點。

邊緣檢測的基本思想首先是利用邊緣增強算子,突出圖像中的局部邊緣,然後定義像素的「邊緣強度」,通過設置閾值的方法提取邊緣點集。由於噪聲和模糊的存在,監測到的邊界可能會變寬或在某點處發生間斷。因此,邊界檢測包括兩個基本內容:(1)用邊緣算子提取出反映灰度變化的邊緣點集。(2)在邊緣點集合中剔除某些邊界點或填補邊界間斷點,並將這些邊緣連接成完整的線。

圖像灰度變化率最大的地方(圖像灰度值變化最劇烈的地方)。圖像灰度在表面變化的不連續造成的邊緣。一般認為邊緣提取是要保留圖像的灰度變化劇烈的區域,這從數學上看,最直觀的方法就是微分(對於數字圖像來說就是差分),在信號處理的角度來看,也可以說是用高通濾波器,即保留高頻信號。邊緣信息包含兩個方面:1.像素的坐標 2.邊緣的方向

邊緣檢測是圖像處理和計算機視覺中的基本問題,邊緣檢測的目的是標識數字圖像中亮度變化明顯的點。圖像屬性中的顯著變化通常反映了屬性的重要事件和變化。這些包括

深度上的不連續

表面方向不連續

物質屬性變化

場景照明變化。

 

邊緣檢測是圖像處理和計算機視覺中,尤其是特徵提取中的一個研究領域。Canny 的目標是找到一個最優的邊緣檢測算法,最優邊緣檢測的含義是:

好的檢測 - 算法能夠儘可能多地標識出圖像中的實際邊緣。

好的定位 - 標識出的邊緣要儘可能與實際圖像中的實際邊緣儘可能接近。

最小響應 - 圖像中的邊緣只能標識一次,並且可能存在的圖像噪聲不應標識為邊緣。

 

Canny算法在分為如下幾個步驟:

輸入彩色圖像,通過高斯模糊去除噪聲 GaussianBlur

灰度轉換 cvtColor

計算梯度 Sobel/Scharr

非最大信號抑制  

高低闕值 輸出二值圖像

接下來讓我們來敲代碼在OpenCV中實現Canny算法吧:

import cv2import numpy as npdef Canny_demo(img):    blur=cv2.GaussianBlur(img,(5,5),0) #除去噪聲    gray=cv2.cvtColor(blur,cv2.COLOR_BGR2GRAY) #圖像灰度    xgrad=cv2.Scharr(gray,cv2.CV_16SC1,1,0) #求梯度Scharr算子    ygrad=cv2.Scharr(gray,cv2.CV_16SC1,0,1)    edge=cv2.Canny(xgrad,ygrad,0,255)    dst=cv2.bitwise_and(img,img,mask=edge)    return edge,dst

首先我們定義了一個Canny_demo函數,函數的主要功能是: 使用高斯模糊除去圖片的噪聲,接著使用cv2.cvtColor 把圖像灰度化,然後求梯度Schaar算子,然後使用Canny算法進行邊緣檢測,最後返回掩模和圖片,函數寫完了,我們來進行調用:

if __name__ == '__main__':    img=cv2.imread('opencv_image/morph02.png')    cv2.imshow('img',img)    _,image=Canny_demo(img)    cv2.imshow('demo',image)    cv2.waitKey(0)

運行結果如下:

Tips:像上面的運行結果,會發現噪點挺多的,我們可以通過加大高斯模糊的算子來除去更多的噪聲。如圖,這是把GaussianBlur中(5,5)加到(9,9)的結果。可見噪聲變得少了。

直線檢測的前提條件是:邊緣檢測已經完成!所以這時候我們可以再寫一個函數來調用我們剛剛寫好的Canny函數,這樣子我們就可以不需要重複地去造輪子。所有代碼如下:

import cv2import numpy as npdef Canny_demo(img):    blur=cv2.GaussianBlur(img,(9,9),0)     gray=cv2.cvtColor(blur,cv2.COLOR_BGR2GRAY)     xgrad=cv2.Scharr(gray,cv2.CV_16SC1,1,0)     ygrad=cv2.Scharr(gray,cv2.CV_16SC1,0,1)    edge=cv2.Canny(xgrad,ygrad,0,255)    dst=cv2.bitwise_and(img,img,mask=edge)    return edge,dst
def find_lines(img): edge,_=Canny_demo(img) lines=cv2.HoughLinesP(edge,1,np.pi/180,100, minLineLength=50, maxLineGap=10) for line in lines: x1,y1,x2,y2=line[0] cv2.line(img,(x1,y1),(x2,y2),(255,0,0),1) return img
if __name__ == '__main__': img=cv2.imread('opencv_image/morph02.png') cv2.imshow('img',img) image=find_lines(img) cv2.imshow('demo',image) cv2.waitKey(0)

程序運行結果:

函數解析:

HoughLinesP(image,rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None

作用:獲得霍夫直線

image

必須是二值圖像,推薦使用canny邊緣檢測的結果圖像

rho

線段以像素為單位的距離精度,double類型的,推薦用1.0

theta

線段以弧度為單位的角度精度,推薦用numpy.pi/180

threshold

累加平面的閾值參數,int類型,超過設定閾值才被檢測出線段,值越大,基本上意味著檢出的線段越長,檢出的線段個數越少。根據情況推薦先用100試試

lines

這個參數的意義未知,發現不同的lines對結果沒影響,但是不要忽略了它的存在

minLineLength

線段以像素為單位的最小長度,根據應用場景設置

maxLineGap

同一方向上兩條線段判定為一條線段的最大允許間隔(斷裂),超過了設定值,則把兩條線段當成一條線段,值越大,允許線段上的斷裂越大,越有可能檢出潛在的直線段

相關焦點

  • 【走進OpenCV】學習Opencv不得不掌握的操作
    學習計算機視覺最重要的能力應該就是編程了,為了幫助小夥伴儘快入門計算機視覺,小白準備了【走進OpenCV】系列,主要幫助小夥伴了解如何調用OpenCV
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 基於opencv 的圖像處理入門教程
    https://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb1.邊緣檢測邊緣檢測主要是通過 Canny() 方法,它實現了 Canny 邊緣檢測器,這也是目前最優的邊緣檢測器。
  • 樹莓派系列(三):openCV之圓檢測
    下面就結合實例和大家介紹下利用opencv裡面的函數來檢測圓形。對當前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示傳遞給canny邊緣檢測算子的高閾值,而低閾值為高閾值的一半。第七個參數,double類型的param2,也有默認值100。它是第三個參數method設置的檢測方法的對應的參數。對當前唯一的方法霍夫梯度法CV_HOUGH_GRADIENT,它表示在檢測階段圓心的累加器閾值。
  • opencv教程-輪廓檢測
    1:輪廓檢測的基本流程圖像灰度化→圖像二值化或邊緣檢測→輪廓檢測2:輪廓特徵輪廓矩,面積,周長等>6:擬合橢圓7:輪廓的常用屬性https://docs.opencv.org10:輪廓提取方式cv2.RETR_EXTERNAL - 只提取最外層的輪廓cv2.RETR_LIST - 提取所有輪廓,並且放置在 list 中cv2.RETR_CCOMP - 提取所有輪廓,並且將其組織為兩層的
  • OpenCV-Python 圖像平滑|十六
    試試這個代碼,並檢查結果:import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('opencv_logo.png')kernel = np.ones((
  • Python+OpenCV的基礎圖像處理操作匯總
    圖像處理是對圖像進行的技術操作與分析,比如為了得到增強的圖像或提取一些有用的信息而進行的一系列操作。隨著我們的發展,許多應用程式使用圖像/幀/視頻作為輸入,對它們進行預處理,並將其輸入到設備或軟體或腳本中。圖像處理也可以是娛樂性的,可以用於許多應用。
  • 【OpenCV入門之十三】如何在ROI中添加Logo
    學習計算機視覺最重要的能力應該就是編程了,為了幫助小夥伴儘快入門計算機視覺,小白準備了【OpenCV入門】系列。
  • 基於 opencv 的圖像處理入門教程
    https://github.com/ccc013/CodesNotes/blob/master/opencv_notes/opencv_image_process_tutorial.ipynb1.邊緣檢測邊緣檢測主要是通過Canny() 方法,它實現了 Canny 邊緣檢測器,這也是目前最優的邊緣檢測器。
  • opencv學習—03圖像運算(一)
    \picture\hai_640x450.png")b = cv2.imread(r"F:\USER\Desktop\Benny\benny\opencv\picture\opencv_640x450.png")result = cv2.addWeighted(a,0.6,b,0.4,0)cv2.imshow("result",result)cv2.imwrite(r"F:\USER\Desktop
  • 給OpenCV初學者的禮物——OpenCV人臉檢測入門教程
    本文的參考文檔見https://docs.opencv.org/4.0.1/d1/dfb/intro.html圖像的基本操作對於人類來說,圖像可以解構為畫面結構、色彩和非常豐富的意象。你可以把它解構為各種色塊或線條,然後用故事性的語言把這幅圖像存在腦海裡。
  • 基於Opencv的身份證圖像信息提取
    為使輪廓檢測更加精準,需要使用二值化圖像,因此在尋找輪廓之前需先對圖像進行閾值化處理或Canny邊緣檢測。在Opencv中,查找輪廓就像在黑色背景中尋找白色物體,因此待搜索的物體應為白色而背景應為黑色。查找輪廓的cv2.findContours()函數有三個輸入參數,第一個是輸入圖像,第二個是輪廓檢索模式,第三個是輪廓近似方法。
  • 從零教你基於 SpringMvc + OpenCV 的答題卡識別系統[開源]
    簡介OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,它提供了一系列圖像處理和計算機視覺方面很多通用算法。
  • OpenCV實戰系列(四):Canny邊緣檢測
    OpenCV為我們提供了一個非常方便的邊緣檢測接口Canny函數,該函數的命名是以其發明者Jhon F.Canny命名的,自1986年被發明後該算法就一直很受歡迎
  • Android 端基於 OpenCV 的邊框識別功能
    ,提取輪廓等等,可以應用於增強現實,人臉識別,運動跟蹤,物體識別,圖像分區等。在 SmartCropper 中只使用到了 opencvcore 與 opencvimgproc 模塊, 所以只需要導入這兩個模塊的頭文件與動態庫/靜態庫就行了。
  • OpenCV基礎 | 1.python3.6+OpenCV4.0環境配置
    接下來的一個系列會更新圖像處理的一些基本知識。學習視頻可參見python+opencv3.3視頻教學 基礎入門[1]今天寫的是python3.6+OpenCV4.0環境的配置環境的配置是基於Anaconda的,沒有下載的小夥伴可以自行下載,附一個anaconda下載教程怎麼安裝
  • ubuntu下安裝opencv
    install python-dev python-numpy七、可選依賴項sudo apt-get install libprotobuf-dev protobuf-compilersudo apt-get install libgoogle-glog-dev libgflags-devsudo apt-get install libgphoto2-dev libeigen3-dev
  • 手把手教你安裝OpenCV與配置環境
    下載連結:連結: https://pan.baidu.com/s/1wgwdpSdhggA6e5gIh00cOA提取碼: 4j7k下載後我們解壓這個文件:OpenCV+dll,會出現兩個文件四個文件2,我們在D盤新建一個名字為opencv3.4的文件夾,將那個opencv-3.4.1_vc15.exe文件拷貝進去,然後雙擊這個exe文件
  • 基於OpenCv 和 Python 的手指識別及追蹤
    應用程式提取用戶手掌的膚色,然後繪製成一個直方圖。繪製長方形的過程遵循以下函數:這個過程非常簡單——我創建了四行代碼來表示每個長方形的坐標。現在用戶理解了在哪裡放置他們的手掌,接下來成功的關鍵步驟是從這些長方形中提取像素,然後基於像素生成 HSV 直方圖函數把輸入框架轉換成 HSV 直方圖。使用 Numpy 庫生成一張圖像。圖像大小為[90*10],顏色通道數為 3。我們將其命名為 ROI (Region of Interest).
  • 【走進OpenCV】霍夫變換檢測直線和圓
    學習計算機視覺最重要的能力應該就是編程了,為了幫助小夥伴儘快入門計算機視覺,小白準備了【走進OpenCV】系列,主要幫助小夥伴了解如何調用OpenCV