python+opencv->邊緣提取與各函數參數解析


前情提要:作為剛入門機器視覺的小伙伴,第一節課學到機器視覺語法時覺得很難理解,

很多人家的經驗,我發現都千篇一律,功能函數沒解析,參數不講解,就一個代碼,所以在此將搜集的解析和案例拿出來匯總!!!

一、opencv+python環境搭建

  其實能寫python的就能寫opencv,但是工具很總要,代碼提示也很重要,你可能會用submit     vs等工具,submit編碼個人覺得不夠智能,vs的話過完年我學的方向不一致,所以沒用

  推薦pycharm ,在項目setting中的項目解釋器中安裝opencv-python即可進行編碼。python環境搭建也灰常方便。

二、邊緣提取案例

  

import cv2
def edge_demo(image):
    #GaussianBlur圖像高斯平滑處理
    blurred = cv2.GaussianBlur(image, (3, 3), 0)
  #(3, 3)表示高斯矩陣的長與寬都是3,意思就是每個像素點按3*3的矩陣在周圍取樣求平均值,,標准差取0
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  #顏色模式轉換成cv2.COLOR_BGR2GRAY模式下的灰度圖像
   
    edge_output = cv2.Canny(gray, 50, 150)
  #提取上一步中處理好的圖像邊緣,50和150分別代表低閾值和高閾值,高閾值用來將物體與背景區分開來,低的用於平滑連接高閾值產生的片段,使圖像成一個整體
    cv2.imshow("canny edge", edge_output)#輸出灰度圖像
  #原圖與灰度圖像與運算,按照灰度圖剪切加和的原圖
    dst = cv2.bitwise_and(image, image, mask=edge_output)    cv2.imshow("color edge", dst)#輸出帶顏色邊緣圖像


if __name__ == '__main__':
    img = cv2.imread("cat.jpg")
    # cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    cv2.imshow("input image", img)
    edge_demo(img)

    cv2.waitKey(0)#等待鍵盤輸入,不輸入 則無限等待
    cv2.destroyAllWindows()#清除所以窗口

三、解釋功能函數

  其實上面的代碼也是用的別人的,但絕大多數都沒有解釋,對於像我這種新手不是很友好

  •   高斯處理

    圖像處理中,常用的濾波算法有均值濾波、中值濾波以及高斯濾波等。

  三種濾波器的對比:
  濾波器種類 基本原理 特點
  均值濾波 使用模板內所有像素的平均值代替模板中心像素灰度值 易收到噪聲的干擾,不能完全消除噪聲,只能相對減弱噪聲
  中值濾波 計算模板內所有像素中的中值,並用所計算出來的中值體改模板中心像素的灰度值 對噪聲不是那么敏感,能夠較好的消除椒鹽噪聲,但是容易導致圖像的不連續性
   高斯濾波 對圖像鄰域內像素進行平滑時,鄰域內不同位置的像素被賦予不同的權值 對圖像進行平滑的同時,同時能夠更多的保留圖像的總體灰度分布特征
  意思就是使你的圖像灰度分布更均勻,每個點的像素均為周圍 按3*3的矩陣在周圍取樣求平均值,,標准差取0來處理
     blurred = cv2.GaussianBlur(image, (3, 3), 0)
#GaussianBlur圖像高斯平滑處理
#(3, 3)表示高斯矩陣的長與寬都是3,意思就是每個像素點按3*3的矩陣在周圍取樣求平均值,,標准差取0
  • 灰度轉換----》也叫做二值化處理

  故名思意就是轉換成黑白圖像,后面的參數中    cv2.COLOR_BGR2GRAY  其實就是色彩模式,所以函數名為 cvtColor(色彩模式轉換)

  cvtColor()用於將圖像從一個顏色空間轉換到另一個顏色空間的轉換(目前常見的顏色空間均支持),並且在轉換的過程中能夠保證數據的類型不變,即轉換后的圖像的數據類型和位深與源圖像一致。

 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  #顏色模式轉換成cv2.COLOR_BGR2GRAY模式下的灰度圖像

 

  • 邊緣識別提取

  這一步是將二值化后的圖像提取邊緣,50和150分別代表低閾值和高閾值,高閾值用來將物體與背景區分開來,低的用於平滑連接高閾值產生的片段,使圖像成一個整體

  簡明而言就是,小的用於細小的地方處理,大的宏觀處理----》大閾值用於分離背景與輪廓,曉得用於拼接細小的輪廓,即可形成一個整體

edge_output = cv2.Canny(gray, 50, 150)
  #提取上一步中處理好的圖像邊緣,50和150分別代表低閾值和高閾值,高閾值用來將物體與背景區分開來,低的用於平滑連接高閾值產生的片段,使圖像成一個整體
  • 輸出即可,小面的函數只是對比學習而已,可以不用

(對於dst = cv2.bitwise_and(image, image, mask=edge_output) cv2.imshow("color edge", dst)#輸出帶顏色邊緣圖像
)  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM