OpenCV3計算機視覺 python 二

2022-07-30 10:24:15 字數 3464 閱讀 8137

當前,在計算機視覺中有三種常用的色彩空間:灰度、bgr以及hsv

1.灰度色彩空間是通過去除彩色資訊來將其轉換為灰階,灰度色彩空間對中間處理特別有效,比如人臉檢測

2.bgr,即藍綠紅色彩空間,每乙個畫素點都由乙個三元組來表示

3.hsv,h(hue)是色調,s(saturation)是飽和度,v(value)表示黑暗的程度(或光譜另一端的明亮程度)

numpy裡有快速傅利葉變換(fft)的包,它包含了fft2()函式,該函式可以計算一副影象的離散傅利葉變換(dft)。

下面通過傅利葉變換來介紹影象的幅度譜。影象的幅度譜是另一種影象,幅度譜影象呈現了原始影象在變化方面的一種表示:把一幅影象中最明亮的畫素放到影象**,然後逐漸變暗,在邊緣上的畫素最暗。這樣可以發現影象中有多少亮的畫素和暗的畫素,以及他們分布的百分比。

高通濾波器是檢測影象的某個區域,然後根據畫素與周圍畫素的亮度差來提公升該畫素的亮度的濾波器

以如下的核kernel為例:

[[0,-0.25,0],

[-0.25,1,-0.25],

[0,-0.25,0]]

核是指一組權重的集合,他會應用在源影象的乙個區域,並由此生成目標影象的乙個畫素。

在計算完**畫素與周圍鄰近畫素的亮度的差值之和以後,如果亮度變化很大,**畫素的亮度會增加,反之則不會。

高通和低通濾波器都有乙個稱為半徑的屬性,它決定了多大面積的鄰近畫素參與濾波運算。

這些濾波器中的所有值加起來為0

k3=ndimage.convolve(img,kernel_3x3)#卷積

k5=ndimage.convolve(img,kernel_5x5)#卷積

blurred=cv2.gaussianblur(img,(11,11),0

)g_hpf=img-blurred

#兩種高通濾波的效果

cv2.imshow(

"3x3

",k3)

cv2.imshow(

"5x5

",k5)

#通過對影象應用低通濾波器之後,與原始影象計算差值

cv2.imshow(

"g_hpf

",g_hpf)

cv2.waitkey()

cv2.destroyallwindows()

低通濾波器(lpf)則是在畫素與周圍畫素的亮度的亮度差值小於乙個特定值時,平滑該畫素的亮度。它主要用於去噪和模糊化。比如說,高斯模糊是最常用的模糊濾波器(平滑濾波器)之一,它是乙個消弱高頻訊號強度的低通濾波器。

邊緣在認類視覺和計算機視覺中均起著重要的作用

opencv提供了許多邊緣檢測濾波函式,包括laplacian()、sobel()以及scharr()。這些濾波函式都會將非邊緣區域轉換為黑色,將邊緣區域轉為白色或其他飽和的顏色。但是這些函式都很容易將雜訊錯誤地識別為邊緣。緩解這個問題的方法是在找到邊緣之前對影象進行模糊處理。opencv也提供了許多模糊濾波函式,包括blur()(簡單的算術平均)、medianblur()以及gaussianblur()。邊緣檢測濾波函式和模糊濾波函式的引數有很多,但總會有乙個ksize引數,它是乙個奇數,表示濾波核的寬和高(以畫素為單位)。

在得到laplacian()函式的結果之後,需要將其轉換成黑色邊緣和白色背景的影象。然後將其歸一化(使其畫素值在0-1之間),並乘以源影象以便能將邊緣變黑

opencv預定義的許多濾波器(濾波函式)都會使用核。其實核是一組權重,它決定如何通過鄰近畫素點來計算新的畫素點。核也稱為卷積矩陣,它對乙個區域的畫素做調和(mix up)或卷積運算。通常基於核的濾波器(濾波函式)被稱為卷積濾波器(濾波函式)。

opencv提供了乙個非常通用的filter2d()函式,它運用由使用者指定的任意核或卷積矩陣。

cv.filter2d(src,-1,kernel,dst)

第二個引數指定了目標影象每個通道的位深度,如果為負值,則表示目標影象和源影象有同樣的位深度。

對於彩色影象來說,filter2d()會對每個通道都用同樣的核。如果要對每個通道使用不同的核,就必須用split()函式和merge()函式

canny邊緣檢測演算法非常複雜,但也很有趣:它有5個步驟,即使用高斯濾波器對影象及逆行去噪、計算梯度、在邊緣上使用非最大抑制(nms)、在檢測到的邊緣上使用雙閾值去除假陽性,最後還會分析所有的邊緣及其之間的連線,以保留真正的邊緣並消除不明顯的邊緣。

這段**首先建立了乙個200x200大小的黑色空白影象,接著在影象的**放置乙個白色方塊,這裡用到了np陣列在切片上賦值的功能。

接下來對影象進行二值化操作,然後呼叫了findcontours()函式。該函式有三個引數:輸入影象,層次型別和輪廓逼近方法。它有幾個方面特別有趣:

1.這個函式會修改輸入影象,因此建議使用原始影象的乙份拷貝

2.由函式返回的層次樹相當重要:cv2.retr_tree引數會得到影象中輪廓的整體層次結構,以此來建立輪廓之間的「關係」。如果只想得到最外面的輪廓,可使用cv2.retr_external。這對消除包含在其他輪廓中的輪廓很有用

findcontours()函式有三個返回值:修改後的影象、影象的輪廓以及他們的層次。使用輪廓來畫出影象的彩色版本,並顯示出來。

opencv3計算機視覺 Python(四)

在opencv中,實現了grabcut分割演算法,該演算法可以方便的分割出前景影象,操作簡單,而且分割的效果很好。演算法的原理參見papaer grabcut interactive foreground extraction using iterated graph cuts 比如下面的一副圖,我...

OpenCV 3計算機視覺(Canny邊緣檢測)

函式原型 edge cv2.canny image,threshold1,threshold2 edges aperturesize l2gradient 第乙個引數是待處理的原影象該函式會將影象處理成黑白,第二個引數是閾值1,第三個引數是閾值三 例如影象調整中的閾值就像一把尺子,它讓高於這把尺子的...

opencv3計算機視覺學習筆記 詞袋 svm

以sift 128維特徵作為例子。例如現在有1000張訓練,對每一張訓練都提取sift的128維特徵,那麼最終可以得到n i 128的特徵,n i 代表第i張圖特徵點的個數,因為每張影象不一樣,所以每張影象的sift 特徵個數也不一樣。提取特徵後對1000張影象提取出的所有sift特徵進行聚類 目的...