最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV圖像卷積之cv.filter2D()函數(shù)詳解

 更新時(shí)間:2022年09月14日 14:47:17   作者:零度蛋花粥  
在其官方文檔中,filter2D()函數(shù)在掩模板介紹中一筆帶過,我認(rèn)為該函數(shù)應(yīng)該進(jìn)行詳細(xì)介紹,下面這篇文章主要給大家介紹了關(guān)于OpenCV圖像卷積之cv.filter2D()函數(shù)的相關(guān)資料,需要的朋友可以參考下

API

照例,我們搬一下官網(wǎng)的 API:

C++

void cv::filter2D(InputArray   src,
                  OutputArray  dst,
                  int          ddepth,
                  InputArray   kernel,
                  Point        anchor=Point(-1, -1),
                  double       delta=0,
                  int          borderType=BORDER_DEFAULT
                  )

Python

dst=cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

函數(shù)詳解

這個(gè)函數(shù)一般是用于圖像的卷積,但 OpenCV 文檔里說這個(gè)函數(shù)不完全等于圖像卷積。這一點(diǎn)說實(shí)話我看到的時(shí)候也震驚到了,我一直是拿它當(dāng)卷積來用的。但是仔細(xì)考慮后,我認(rèn)為這一點(diǎn)完全是定義上的差異,日常用的圖像卷積定義和這個(gè)函數(shù)的功能實(shí)際上是一致的。

HelloWorld

直接上手做往往能給人最直觀的感受。因此,最開始這里我要放一個(gè)使用這個(gè)函數(shù)的最小化程序,可以稱之為該函數(shù)的 hello world 程序。這個(gè)程序跑通了,就可以很方便地嘗試其他參數(shù)的作用了。

# HelloWrold Program of cv.filter2D
# by Aling on 2021/1/18
import numpy as np
import cv2 as cv

def main():
    img = cv.imread("你想讀的圖片")
    
    # 定義卷積核
    kernel = np.ones((10, 10)) / 100
    
    # 執(zhí)行濾波
    avg_filtered = cv.filter2D(img, -1, kernel)

    # 顯示圖片
    cv.imshow("Average filtered", avg_filtered)
    cv.waitKey(0)
    cv.destroyAllWindows()

if __name__ == "__main__":
    main()

這個(gè)程序讀取一張圖片,并將其通過10 x 10 的卷積核作均值濾波并顯示結(jié)果。

濾波效果

參數(shù)詳解

同樣的,這里把各個(gè)參數(shù)打一張表:

參數(shù)類型是否必須指定(默認(rèn)值)具體含義
srcnumpy.ndarray原圖像
ddepthint目標(biāo)圖像深度(指數(shù)據(jù)類型)
kernelnumpy.ndarray卷積核
anchortuple否(卷積核中心)卷積錨點(diǎn)
delta是數(shù)據(jù)類就行否(0)偏移量,卷積結(jié)果要加上這個(gè)數(shù)字
borderTypeint(實(shí)際上是 enum 類)否(cv.BORDER_DEFALUT)邊緣類型

src

這個(gè)參數(shù)沒什么好說的,就是原圖像。它可以是任何色彩模式,這就意味著如果你把原本送到這個(gè)函數(shù)里的圖片從黑白變成了彩色(單通道變成了 3 通道),你并不需要更改其他參數(shù)。本身,對(duì)多通道的圖像,卷積就是以通道為單位進(jìn)行的。

ddepth

這個(gè)參數(shù)有點(diǎn)費(fèi)解了。大部分情況下不需要管它是干嘛的,直接把它設(shè)成 -1 就沒有任何問題。

參數(shù)名 ddepth ,英文是 desired depth,即期望深度。什么意思呢?我們來看它的可能取值表(來自這里):

輸入深度(src.depth())期望深度(ddepth
CV_8U-1/CV_16S/CV_32F/CV_64F
CV_16U/CV_16S-1/CV_32F/CV_64F
CV_32F-1/CV_32F/CV_64F
CV_64F-1/CV_64F

這個(gè)表里的一大串 CV 打頭的符號(hào)到底是什么意思呢?實(shí)際上這些符號(hào)的末尾字母對(duì)應(yīng)了數(shù)據(jù)類型:

U == Unsigned int  # 無符號(hào)整型
S == Signed int    # 有符號(hào)整型
F == Float         # 浮點(diǎn)型

中間的數(shù)字很顯然代表了數(shù)據(jù)類型所占用的空間(bit)。所以,所謂深度,其實(shí)指的是數(shù)據(jù)類型

那就好說了,你會(huì)發(fā)現(xiàn)這里其實(shí)是規(guī)定了輸出數(shù)據(jù)的類型,包括每個(gè)通道的每個(gè)像素占用多少空間。輸出數(shù)據(jù)的類型必須根據(jù)上面的表格中輸入對(duì)應(yīng)的類型指定。這里 -1 表示輸出類型和輸入相同

不過,值得注意的是,似乎有些數(shù)據(jù)類型無法通過 cv2.imshow 正常顯示,可以用 matplotlib.pyplot.imshow 來代替。

但是,還是注意,沒有關(guān)于數(shù)據(jù)類型的特別要求時(shí),這個(gè)功能是不需要的,取 -1 即可。

kernel & anchor

這兩個(gè)參數(shù)都是卷積相關(guān)的,因此放在一節(jié)里面講述。接下來的內(nèi)容假設(shè)你已經(jīng)了解了圖像卷積。

這里,kernel 很顯然表示的是卷積核,這是一個(gè) numpy.ndarray 類型的矩陣。這個(gè)矩陣的生成可以用 numpy 自帶的函數(shù),但是對(duì)于復(fù)雜一些的卷積核,OpenCV 內(nèi)部的一些函數(shù)顯然更合適。如 getStructuringElement,getGaussianKernel,前者用于獲取特定形狀的核,后者則是高斯核生生成器(不過要注意生成的是一個(gè)向量)。

# 方法一示例
kernel = cv.getStructuringElement(cv.MORPH_RECT, (11, 11))

# 方法二示例
vector = cv.getGaussianKernel(11, -1)
kernel = vector @ vector.T

anchor 則表示錨點(diǎn)。什么叫錨點(diǎn)呢?看下面這張圖:

convolution

可以說,錨點(diǎn) anchor 決定了卷積核相對(duì)于生成目標(biāo)點(diǎn)的位置。雖然錨點(diǎn)是相對(duì)于卷積核來定義的,但是卷積的過程更像是通過錨點(diǎn)去尋找卷積核。遍歷圖像中的每一個(gè)像素,以每一個(gè)像素為錨點(diǎn),按照相對(duì)位置生成卷積范圍,和卷積核對(duì)應(yīng)元素相乘再求和得到目標(biāo)圖像中對(duì)應(yīng)像素的值??梢杂霉奖硎境桑?/p>

這實(shí)際上就是一般的圖像卷積計(jì)算方法。OpenCV 文檔里面敘述的卷積定義則是需要將卷積核圍繞錨點(diǎn)對(duì)稱變換,再用上面的公式計(jì)算。這種方法更接近卷積原始的定義,但是對(duì)圖像的卷積一般的應(yīng)用而言(濾波、深度學(xué)習(xí))這兩種定義實(shí)際上沒有什么區(qū)別。、

錨點(diǎn)用一個(gè)元組指定,是相對(duì)于卷積核左上角的坐標(biāo),從 0 開始

# 替換掉 HelloWorld 程序的對(duì)應(yīng)行。
avg_filtered = cv.filter2D(img, -1, kernel, (1, 2))

delta

這個(gè)參數(shù)的存在其實(shí)有些費(fèi)解,它的效果很簡(jiǎn)單,就是把卷積的結(jié)果加上一個(gè)固定的數(shù)字。直觀上將,它將整個(gè)圖像變亮或者變暗了。從應(yīng)用上來說,它實(shí)際上將卷積過程擴(kuò)展成了一般的線性運(yùn)算( ∗ * ∗ 表示卷積):

這個(gè)線性運(yùn)算可以將結(jié)果限定在某一符合要求的范圍內(nèi)(比如大于 0),而且不會(huì)阻斷梯度的傳遞。

borderType

這個(gè)參數(shù)更改的是 border 的生成方式。這個(gè) border,也就是邊緣,是在靠近邊緣的部分卷積時(shí)用到的,參考上面那張圖。無論 anchor 是什么,總有些邊緣上的點(diǎn)對(duì)應(yīng)的卷積范圍無法完全落在原圖內(nèi),這就需要對(duì)原圖進(jìn)行擴(kuò)展。擴(kuò)展的方法就是我們這里參數(shù)的含義。

這個(gè)參數(shù)取值是 OpenCV 里的 cv::BorderTypes enum 類定義的值,其可能取值及其對(duì)于邊緣的作用結(jié)果如下圖所示(圖片來自 OpenCV Python 教程):

border from opencv document

要注意幾點(diǎn):

  • cv.BORDER_WARP 在這個(gè)函數(shù)里面是不支持的;
  • cv.BORDER_CONSTANT 會(huì)將邊緣取為 0(黑色),而且沒法改,因?yàn)樵瘮?shù)并沒有留出相關(guān)的接口。

擴(kuò)展——濾波相關(guān)函數(shù)

圖像濾波是一個(gè)很常用的功能,對(duì)此,OpenCV 也定義了很多函數(shù)。這里介紹的 cv.filter2D 是這些函數(shù)中可控性最高的,因?yàn)槟憧梢杂米远x的核進(jìn)行卷積。但是一些常用的濾波,我們可以不必自己定義相應(yīng)的核,直接用定義好的函數(shù)就可以了。

均值濾波

dst = cv.blur(img, (11, 11))

# 等效于:
dst = cv.filter2D(img, -1, np.ones((11, 11))/11**2)

高斯濾波

dst = cv.GaussianBlur(img, (11, 11), -1)

# 等效于
vector = cv.getGaussianKernel(11, -1)
kernel = vector @ vector.T
dst = cv.filter2D(img, -1, kernel)

中值濾波

dst = cv.medianBlur(img, 11)

注意中值濾波是取中位數(shù)作為目標(biāo)值,是一個(gè)非線性濾波子,因此無法通過線性濾波的 cv.filter2D 來等效實(shí)現(xiàn)。

參考鏈接

總結(jié)

到此這篇關(guān)于OpenCV圖像卷積之cv.filter2D()函數(shù)詳解的文章就介紹到這了,更多相關(guān)OpenCV圖像卷積cv.filter2D()函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 11個(gè)Python的循環(huán)技巧分享

    11個(gè)Python的循環(huán)技巧分享

    當(dāng)我們處理數(shù)據(jù)時(shí),有時(shí)候需要?jiǎng)?chuàng)建多個(gè)列表以存儲(chǔ)不同類型或不同條件下的數(shù)據(jù),在Python中,我們可以利用循環(huán)來快速、高效地創(chuàng)建這些列表,本文將介紹如何使用循環(huán)在Python中創(chuàng)建多個(gè)列表,需要的可以參考下
    2024-04-04
  • Python3 循環(huán)語句(for、while、break、range等)

    Python3 循環(huán)語句(for、while、break、range等)

    這篇文章主要介紹了Python3 循環(huán)語句(for、while、break、range等),大家把下面的文章看完就基本上就可以了解了python的循環(huán)實(shí)現(xiàn)方式了
    2017-11-11
  • python基礎(chǔ)之匿名函數(shù)介紹

    python基礎(chǔ)之匿名函數(shù)介紹

    大家好,本篇文章主要講的是python基礎(chǔ)之匿名函數(shù)介紹,感興趣的同學(xué)趕快來看一看,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 如何在Cloud Studio上執(zhí)行Python代碼?

    如何在Cloud Studio上執(zhí)行Python代碼?

    這篇文章主要介紹了如何在Cloud Studio上執(zhí)行Python代碼?,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python數(shù)據(jù)分析之pandas函數(shù)詳解

    Python數(shù)據(jù)分析之pandas函數(shù)詳解

    這篇文章主要介紹了Python數(shù)據(jù)分析之pandas函數(shù)詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的pandas函數(shù)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • 深入解讀Python解析XML的幾種方式

    深入解讀Python解析XML的幾種方式

    這篇文章主要為大家詳細(xì)介紹了深入解讀Python解析XML的幾種方式,以ElementTree模塊為例,演示具體使用方法和場(chǎng)景,感興趣的小伙伴們可以參考一下
    2016-02-02
  • python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法

    python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法

    今天小編就為大家分享一篇python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python3.6的venv模塊使用詳解

    python3.6的venv模塊使用詳解

    這篇文章主要介紹了python3.6的venv模塊使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • python GUI庫圖形界面開發(fā)之PyQt5日期時(shí)間控件QDateTimeEdit詳細(xì)使用方法與實(shí)例

    python GUI庫圖形界面開發(fā)之PyQt5日期時(shí)間控件QDateTimeEdit詳細(xì)使用方法與實(shí)例

    這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5日期時(shí)間控件QDateTimeEdit詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下
    2020-02-02
  • Python3.8.2安裝包及安裝教程圖文詳解(附安裝包)

    Python3.8.2安裝包及安裝教程圖文詳解(附安裝包)

    這篇文章主要介紹了Python3.8.2安裝包及安裝教程圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

九江市| 墨竹工卡县| 泸西县| 安图县| 虞城县| 益阳市| 广东省| 东乌珠穆沁旗| 永年县| 黔西县| 民勤县| 陵川县| 河北区| 大姚县| 卓尼县| 图木舒克市| 辽阳市| 阿鲁科尔沁旗| 山西省| 安阳县| 原阳县| 龙泉市| 龙川县| 苗栗市| 延长县| 嘉义县| 遂平县| 晋宁县| 湘乡市| 洞口县| 永昌县| 惠州市| 嘉义县| 六枝特区| 奉节县| 连南| 兴国县| 芜湖市| 县级市| 上林县| 大连市|