(學習筆記)計算機視覺(上)

前言

記錄一下課程學習過程(主要)以及個人對課程的評價,課程鏈接:

  • https://edu.csdn.net/course/detail/26281

環境

  • windows10 + python3.7

另外,之前在學校上過數字圖像處理的課程,並非零基礎,因此過的比較快
當然,下面寫的也比較粗略

第一章

在這裏插入圖片描述
從文件的名稱可以大致地瞭解到第一章主要是介紹計算機視覺的相關概念。
1.1 概念(略)
1.2 環境配置
由於我自己的python版本是3.7和課程裏面的不一樣,因此在下載的文件方面不一樣。打開anaconda 官網可以看到現在anaconda 支持的版本也是python3.7,剛開始是選擇在官網下,但是網速確實一言難盡。於是想到了換個網站下,因此想到了清華的鏡像源。清華鏡像源的鏈接如下:

  • https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=A

之後按照PDF裏面說的繼續往下走,在裝anaconda的時候有一個是可以打鉤選擇將其加入path的,下面是我從網上找的圖,說的就是第一項,我當時是打鉤了的,後面就不用去配置環境變量。當然,衆說紛紜,這個勾不勾自己看着辦。比如截圖中的這位就說不勾。
在這裏插入圖片描述
之後進到安裝opencv 的步驟中,這裏python版本不一樣因此也要選擇不同的opencv版本。比如我選的版本是:

  • opencv_python-4.1.2+contrib-cp37-cp37m-win_amd64

之後按照PDF步驟走即可。在運行第一個程序的那一塊,個人比較推薦下個IDE,可以是pycharm 或 vscode 。我win上面裝的是vscode。vscode會比較小。

在這裏插入圖片描述
在這裏插入圖片描述
1.3 課程體系結構概念(略)
1.4 視覺系統構成要素

  • 照明設備
  • 成像設備
  • 處理設備
  • 算法軟件

第二章

在這裏插入圖片描述
2.1 照明模型(概念)

  • 光通量
    光通量是人眼能感受到的輻射功率,等於單位時間內某一波段的輻射能量和該波段的相對視見率的乘積。
  • 輻照度
    輻照度是投射到一平表面上的輻射通量密度。指到達一平表面上,單位時間,單位面積上的輻射能量

2.2 幾種常見的顏色模型(RGB,CMYK,HSI/HSV)

  • 注意各個英文字母的含義,以及HSI/HSV的區別
    在這裏插入圖片描述
    在這裏插入圖片描述

2.3 傳感器基本原理,數字圖像的表示方式

  • 這一塊建議看看《數字圖像處理》課本

2.4 實戰演練(調用opencv 的相關函數)(略)

第三章

在這裏插入圖片描述
3.1 卷積與濾波

  • 數字圖像每個像素值都是離散值因此運用離散形式的卷積公式。

在這裏插入圖片描述
公式看不懂問題不大,主要是要把老師後面講的例子理解。卷積在後面會經常用到,深度學習的CNN的意思就是卷積神經網絡。

  • PDF裏面的例子5x5的矩陣最後得到的結果是3x3的。注意觀察可以發現其原因是未對邊緣部分進行處理,一般情況下都是不對圖像邊緣進行處理的,若是要考慮圖像邊緣,則需要對圖形進行邊緣填充,常見的有在邊緣進行補0,其餘的有興趣的可以搜下圖像的padding。

3.2 平滑濾波

  • 本質其實還是卷積。用某些算子進行卷積可以得到平滑,用某些算子進行卷積可以得到銳化。核心還是要理解卷積。
  • 算子其實也就是濾波器,注意區分各種算子
  • 均值濾波,中值濾波(有效去除椒鹽噪聲),高斯濾波(實際用的比較多,前面兩個考的比較多),雙邊濾波(少見)
  • 中值濾波取的窗口裏面的元素個數爲奇數,將其從小到大排列(反過來也行,一般從小到大),取其中位數作爲當前的值

3.3 數學形態學濾波

  • 這裏關於腐蝕膨脹的部分後面再寫博客闡述,因爲視頻裏講的和我以前學的有點出入
  • 開運算:先腐蝕後膨脹(可以消除細小噪聲)
  • 閉運算:先膨脹後腐蝕

3.4 實戰演練(opencv相關的濾波函數)(略)

第四章

在這裏插入圖片描述
4.1 邊緣檢測基本思想和基本的邊緣檢測算子

  • 邊緣處梯度較大,因此可以求梯度然後對其進行篩選得到邊緣信息(後面可能還會根據這些邊緣信息進行一些銳化操作)。在數字圖像處理的過程中一般會用差分來代替梯度原來的計算公式。
  • 正如前面講的,在這一塊的計算過程有點類似於卷積。
  • 記住常見的算子

在這裏插入圖片描述

  • sobel最常用
    在這裏插入圖片描述
    在這裏插入圖片描述
  • laplace of gaussian
    在這裏插入圖片描述

4.2 canny算子

  • 優點:邊緣可以自動連接,檢測準確、對噪聲穩健,故應用廣泛
  • 基本步驟
平滑圖像
計算梯度(幅值和方向)
梯度幅值進行非極大值抑制(只保留幅值局部變化最大的點)
自動邊緣連接

在這裏插入圖片描述

  • 通過查看弱邊緣像素及其8個領域像素,只要其中一個爲強邊緣像素,則該弱邊緣點就可以保留爲真實的邊緣。

4.3 數學形態學變換擴展(黑帽、頂帽、HMT、梯度)

  • 邊緣梯度gradient:灰度膨脹圖像和腐蝕圖像的差值
  • 頂帽變換tophat:圖像與其開運算的差值
  • 黑帽變換blackhat:圖像閉運算與自身的差值
頂帽和黑帽的結合使用能用於增強對比度
做法:將img + 頂帽變換 -黑帽變換
	enhanced=img+tophat-bottomhat
  • 擊中或擊不中變換HMT:輸出圖像由所有在B1 中匹配的像素(擊中)和未在B2中匹配的像素(擊不中)組成

4.4 實戰演練

  • 代碼1
# 圖像邊緣檢測
import cv2

img=cv2.imread("lena.png")
cv2.imshow("lena.png",img)
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# sobel 邊緣檢測算子
# dx dy參數是sobel 的x y 方向的選擇
sobel=cv2.Sobel(img,cv2.CV_16S,1,0,ksize=3)
#laplacian
laplacian=cv2.Laplacian(img,cv2.CV_16S)
#canny
canny=cv2.Canny(img,50,120)

# 如果沒有以下兩行代碼,sobel,laplacian沒有顯示
# 原因在於imshow顯示8位uint,而sobel,laplcian 每個像素對應的是16位的int
sobel=cv2.convertScaleAbs(sobel)
laplacian=cv2.convertScaleAbs(laplacian)

cv2.imshow("sobel",sobel)
cv2.imshow("laplacian",laplacian)
cv2.imshow("canny",canny)

cv2.waitKey()
cv2.destroyAllWindows()
  • 代碼2
# 形態學濾波
import cv2
import numpy as np

def gause_noise(image,mean=0,var=0.001):
    image=np.array(image/255,dtype=float)
    noise=np.random.normal(mean,var**0.5,image.shape)
    out=image+noise
    if out.min() < 0:
        low_clip = -1
    else:
        low_clip = 0

    out = np.clip(out,low_clip,1.0)
    out = np.uint8(out*255)
    return out

# 以灰度圖形式打開lena圖
img=cv2.imread("lena.png",0)
nimg=gause_noise(img)

# 生成形態學的結構化元素,形狀十字形,大小3x3
kernel =cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
eroded =cv2.erode(img,kernel)#腐蝕
dilated =cv2.dilate(img,kernel)#膨脹

#開運算
opened = cv2.morphologyEx(nimg,cv2.MORPH_OPEN,kernel)
#在開運算的基礎上再進行閉運算
closed= cv2.morphologyEx(opened,cv2.MORPH_CLOSE,kernel)


# cv2.imshow("noise img",nimg)
# cv2.imshow("erode",eroded)
# cv2.imshow("dilate",dilated)
# cv2.imshow("opened",opened)
# cv2.imshow("closed",closed)

gradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow("gradient",gradient)

# 頂帽黑帽變換
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
bottomhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow("tophat",tophat)
cv2.imshow("bottomhat",bottomhat)

enhanced=img+tophat-bottomhat
cv2.imshow("enhanced",enhanced)

# 擊中,擊不中變換結果
kernel1=np.array(([0,1,0],[1,-1,1],[0,1,0]),dtype='int')
hmt=cv2.morphologyEx(img,cv2.MORPH_HITMISS,kernel1)
cv2.imshow("hmt",hmt)

cv2.waitKey()
cv2.destroyAllWindows()

第五章之後的待續

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