欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV圖像處理之自定義濾波

 更新時間:2021年08月25日 09:46:46   作者:飛鳶逐浪  
濾波處理分為兩大類:線性濾波和非線性濾波,OpenCV里有這些濾波的函數(shù),使用起來非常方便,這篇文章主要給大家介紹了關(guān)于OpenCV圖像處理之自定義濾波的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

圖像處理中,"空間域" 指的是圖像平面,因此,空間濾波可定義為:在圖像平面內(nèi)對像素灰度值進(jìn)行的濾波

1 空間濾波

1.1 濾波過程

如圖,F(xiàn)ilter 是一個 3x3 濾波核,當(dāng)它從圖像的左上角開始,逐個像素沿水平方向掃描,最后到右下角時,便會產(chǎn)生濾波后的圖像

假設(shè)輸入圖像 $f(x, y)$,濾波后的圖像為$g(x, y)$,則其中$g(2,2)$ 和 $g(4,4)$ 的計(jì)算過程如下:

上圖中,以像素 (4,4) 為中心的 3x3 鄰域,和濾波核的向量點(diǎn)乘之積,即為 g(4,4)

g(4,4) = 240*0.1111 + 183*0.1111 + 0*0.1111 + 250*0.1111 + 12*0.1111 + 87*0.1111 + 255*0.1111 + 1*0.1111 + 94*0.1111

= 26.6666 + 20.3333 + 0 + 27.7777 + 1.3333 + 9.6666 + 28.3333 + 0 + 10.4444

= 124.55

1.2 相關(guān)和卷積

空間濾波中,相關(guān)和卷積,是容易混淆的概念,定義如下:

-相關(guān) (Correlation),和上述的濾波過程一樣,即 濾波核 逐行掃描圖像,并計(jì)算每個位置像素點(diǎn)積的過程

-卷積 (Convolution),和 "相關(guān)" 過程類似,但 濾波核 要先旋轉(zhuǎn) 180°,然后再執(zhí)行和 “相關(guān)” 一樣的操作

(二維中的旋轉(zhuǎn) 180°,等于濾波核沿一個坐標(biāo)軸翻轉(zhuǎn),然后再沿另一個坐標(biāo)軸翻轉(zhuǎn))

注意:如果濾波核是對稱的,則對圖像進(jìn)行相關(guān)和卷積的結(jié)果是一致的

2 OpenCV 函數(shù)

2.1 filter2D 函數(shù)

在 OpenCV 中,可自定義濾波核,然后通過 filter2D() 來完成圖像濾波

void filter2D(
     InputArray     src,              // 輸入圖像 
     OutputArray    dst,              // 輸出圖像(大小和通道數(shù),同 src)
     int            ddepth,           // 輸出圖像的 depth
     InputArray     kernel,           // 濾波核,準(zhǔn)確地說,是相關(guān)核
     Point  anchor = Point(-1,-1),    // 錨點(diǎn)位置,濾波核尺寸為奇數(shù)時,不用指定,一般取默認(rèn)值 Point(-1,-1);濾波核尺寸為偶數(shù)時,需指定錨點(diǎn)位置
     double             delta = 0,    // optional value added to the filtered pixels before storing them in dst      
     int borderType = BORDER_DEFAULT  // 邊界處理方法
 );

filter2D() 求的是相關(guān),并非卷積,只有當(dāng)濾波核對稱時,filte2D() 才可視為卷積運(yùn)算,其公式如下:

假定濾波核 kernel 大小為 3x3,以一個像素點(diǎn) src(4,4) 為例,則有:

dst(4,4) = kernel(0,0)*src(4+0-1, 4+0-1) + kernel(0,1)*src(4+0-1, 4+1-1) + kernel(0,2)*src(4+0-1, 4+2-1)

+ kernel(1,0)*src(4+1-1, 4+0-1) + kernel(1,1)*src(4+1-1, 4+1-1) + kernel(1,2)*src(4+1-1, 4+2-1)

+ kernel(2,0)*src(4+2-1, 4+0-1) + kernel(2,1)*src(4+2-1, 4+1-1) + kernel(2,2)*src(4+2-1, 4+2-1)

濾波核與輸入圖像的卷積點(diǎn)乘,對應(yīng)關(guān)系如下:

2.2 flip 函數(shù)

當(dāng)濾波核不對稱時,要得到真正的卷積運(yùn)算,還需 flip() 函數(shù)來完成 kernel 的二維翻轉(zhuǎn)

如果濾波核的大小為奇數(shù),則 filter2D() 中的錨點(diǎn)位置可設(shè)為 Point(-1,-1),此時,默認(rèn)濾波核的中心為錨點(diǎn);如果濾波核的大小為偶數(shù),則需要自定義錨點(diǎn)位置

OpenCV 中錨點(diǎn)位置的實(shí)現(xiàn)函數(shù)normalizeAnchor() 如下:

  void flip(
      InputArray  src,  // input array
      OutputArray dst,  // output array
      int    flipCode   // 0, flip around x-axis; positive value, flip around y-axis; negative value, flip around both axes.
  );

3 代碼示例

3.1 偏導(dǎo)數(shù)

自定義濾波核,利用 filter2D() 函數(shù),實(shí)現(xiàn)圖像的一階和二階偏導(dǎo)運(yùn)算

1) 一階偏導(dǎo)

圖像在 x 和 y 方向的一階偏導(dǎo)如下:

對應(yīng)濾波核為

2) 二階偏導(dǎo)

同樣,在 x 和 y 方向的二階偏導(dǎo)如下:

對應(yīng)濾波核為

3.2 代碼示例

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace cv;

int main()
{
    // 讀取圖像
    Mat src = imread("fangtze.jpg", IMREAD_GRAYSCALE);
    if (src.empty()) {
        return -1;
    }

    Mat kx = (Mat_<float>(1, 2) << -1, 1);  // 1行2列的 dx 濾波核
    Mat ky = (Mat_<float>(2, 1) << -1, 1);  // 2行1列的 dy 濾波核

    Mat kxx = (Mat_<float>(1, 3) << 1, -2, 1);     // 1行3列的 dxx 濾波核
    Mat kyy = (Mat_<float>(3, 1) << 1, -2, 1);     // 3行1列的 dyy 濾波核
    Mat kxy = (Mat_<float>(2, 2) << 1, -1, -1, 1); // 2行2列的 dxy 濾波核

    // 一階偏導(dǎo)
    Mat dx, dy;
    filter2D(src, dx, CV_32FC1, kx);
    filter2D(src, dy, CV_32FC1, ky);

    // 二階偏導(dǎo)
    Mat dxx, dyy, dxy;
    filter2D(src, dxx, CV_32FC1, kxx);
    filter2D(src, dyy, CV_32FC1, kyy);
    filter2D(src, dxy, CV_32FC1, kxy);

    // 顯示圖像
    imshow("dx", dx);

    waitKey();
}

輸出的偏導(dǎo)圖像如下,第一行從左到右:原圖 - dx - dy;第二行從左至右:dxy - dxx -dyy

參考資料

OpenCV Tutorials / imgproc module /Making your own linear filters

Gonzalez,《Digital Image Processing》4th ch3 Intesity Transformations and Spatial Filtering

CS425 Lab: Intensity Transformations and Spatial Filtering

總結(jié)

到此這篇關(guān)于OpenCV圖像處理之自定義濾波的文章就介紹到這了,更多相關(guān)OpenCV自定義濾波內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • flask框架url與重定向操作實(shí)例詳解

    flask框架url與重定向操作實(shí)例詳解

    這篇文章主要介紹了flask框架url與重定向操作,結(jié)合實(shí)例形式詳細(xì)分析了flask框架URL映射、傳參、重定向等相關(guān)概念、原理與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • Python with語句上下文管理器兩種實(shí)現(xiàn)方法分析

    Python with語句上下文管理器兩種實(shí)現(xiàn)方法分析

    這篇文章主要介紹了Python with語句上下文管理器兩種實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python上下文管理器的相關(guān)概念、功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-02-02
  • 詳解Python網(wǎng)絡(luò)框架Django和Scrapy安裝指南

    詳解Python網(wǎng)絡(luò)框架Django和Scrapy安裝指南

    這篇文章主要介紹了詳解Python網(wǎng)絡(luò)框架Django和Scrapy安裝指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Ubuntu下升級 python3.7.1流程備忘(推薦)

    Ubuntu下升級 python3.7.1流程備忘(推薦)

    這篇文章主要介紹了Ubuntu下升級 python3.7.1流程備忘,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-12-12
  • jupyter notebook指定啟動目錄的方法

    jupyter notebook指定啟動目錄的方法

    這篇文章主要介紹了jupyter notebook指定啟動目錄的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python中常用的十個函數(shù)介紹

    Python中常用的十個函數(shù)介紹

    這篇文章主要介紹了Python中常用的十個函數(shù),shutil 是 Python 中的高級文件操作模塊,與os模塊形成互補(bǔ)的關(guān)系,需要的朋友可以參考下
    2023-04-04
  • pandas 使用insert插入一列

    pandas 使用insert插入一列

    這篇文章主要介紹了pandas 使用insert插入一列的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python with用法:自動關(guān)閉文件進(jìn)程

    Python with用法:自動關(guān)閉文件進(jìn)程

    這篇文章主要介紹了Python with用法:自動關(guān)閉文件進(jìn)程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python代碼生成視頻的縮略圖的實(shí)例講解

    Python代碼生成視頻的縮略圖的實(shí)例講解

    在本篇文章里小編給大家正里的是一篇關(guān)于Python代碼生成視頻的縮略圖的實(shí)例講解,對此有需要的朋友們可以跟著學(xué)習(xí)下。
    2019-12-12
  • Python爬蟲UA偽裝爬取的實(shí)例講解

    Python爬蟲UA偽裝爬取的實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于Python爬蟲UA偽裝爬取的實(shí)例講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-02-02

最新評論