日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

数字图像处理与Python实现笔记之频域滤波

發(fā)布時間:2024/10/8 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数字图像处理与Python实现笔记之频域滤波 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)字圖像處理與Python實現(xiàn)筆記

  • 摘要
  • 緒論
  • 1 數(shù)字圖像處理基礎(chǔ)知識
  • 2 彩色圖像處理初步
  • 3 空間濾波
  • 4 頻域濾波
    • 4.1 傅里葉變換
      • 4.1.1 一維傅里葉變換
      • 4.1.2 二維傅里葉變換
    • 4.2 傅里葉變換的性質(zhì)
      • 4.2.1 傅里葉變換的基本性質(zhì)
      • 4.2.2 二維傅里葉變換的性質(zhì)
    • 4.3 快速傅里葉變換
      • 4.3.1 快速傅里葉變換的原理
      • 4.3.2 快速傅里葉變換的實現(xiàn)
    • 4.4 圖像的頻域濾波
      • 4.4.1 低通濾波
        • 第一種 理想低通濾波器
        • 第二種 Butterworth低通濾波器
      • 4.4.2 高通濾波
        • 第一種 理想高通濾波
        • 第二種 Butterworth高通濾波
        • 第三種 高頻增強(qiáng)濾波器
    • 4.5 小結(jié)
  • 參考資料

摘要

  • 簡要介紹數(shù)字圖像處理涉及的一些基本概念、基本運(yùn)算、基本類型,以及如何通過Python對數(shù)字圖像進(jìn)行讀取和簡單操作。
  • 以彩色圖像為例對數(shù)字圖像處理的基本操作進(jìn)行介紹,熟悉數(shù)字圖像處理的基本過程,主要包括顏色空間的基本概念、偽彩色圖像處理操作,彩色圖像處理簡單操作。
  • 瞄準(zhǔn)在空間域中對圖像進(jìn)行增強(qiáng),介紹空間濾波的機(jī)理、基本概念以及使用的基本技術(shù)。本章內(nèi)容包括空間濾波基本概念、基于空間濾波的圖像平滑處理、基于空間濾波的銳化操作以及混合空間增強(qiáng)。
  • 從頻域角度入手對圖像處理及增強(qiáng)方法展開介紹。因為頻域濾波所需的數(shù)學(xué)知識較多,所以本章采取由淺入深的策略,首先介紹一維傅里葉變換,其次介紹二維傅里葉變換和快速傅里葉變換,最后介紹圖像頻域濾波中出現(xiàn)的各種技術(shù),其大體可分為低通濾波和高通濾波兩大類。
  • 從全局特征提取和局部特征提取兩方面入手,分別介紹顏色特征、紋理特征、形狀特征、邊緣特征、點特征的提取方法。本章內(nèi)容是目前機(jī)器視覺和圖像處理領(lǐng)域的學(xué)者關(guān)注較多的內(nèi)容,通過穿插較多的實例,幫助讀者理解圖像特征提取的基本技術(shù)。
  • 瞄準(zhǔn)如何減少圖像傳輸及存儲數(shù)據(jù)大小,介紹主要使用的壓縮技術(shù),包括有損壓縮和無損壓縮等,并使用JPEG壓縮技術(shù)串講全章知識點。
  • 介紹圖像的小波域表示及多分辨率表示。
  • 緒論

    • 人工智能是引領(lǐng)未來發(fā)展的戰(zhàn)略性技術(shù),是新一輪科技革命和產(chǎn)業(yè)變革的重要驅(qū)動力量,將深刻地改變?nèi)祟惿鐣睢?/p>

    • 促進(jìn)人工智能和實體經(jīng)濟(jì)的深度融合,構(gòu)建數(shù)據(jù)驅(qū)動、人機(jī)協(xié)同、跨界融合、共創(chuàng)分享的智能經(jīng)濟(jì)形態(tài),更是推動質(zhì)量變革、效率變革、動力變革的重要途經(jīng)。

    • 進(jìn)年來,我國人工智能新技術(shù)、新產(chǎn)品、新業(yè)態(tài)持續(xù)涌現(xiàn),與農(nóng)業(yè)、制造業(yè)、服務(wù)業(yè)等行業(yè)的融合步伐明顯加快,在技術(shù)創(chuàng)新、應(yīng)用推廣、產(chǎn)業(yè)發(fā)展等方面成效初顯。

    • 人工智能技術(shù)并不是一個新生事物,它在最近幾年引起全球性關(guān)注并得到飛速發(fā)展的主要原因,在于它的三個基本要素(算法、數(shù)據(jù)、算力)的迅猛發(fā)展,其中又以數(shù)據(jù)和算力的發(fā)展尤為重要。

    • 物聯(lián)網(wǎng)技術(shù)的蓬勃發(fā)展使得數(shù)據(jù)累計的難度越來越低,而芯片算力的不斷提升,使得過去只能通過云計算才能完成的人工智能運(yùn)算,現(xiàn)在可以下沉到最普通的設(shè)備上完成。

    • 物聯(lián)網(wǎng)技術(shù)為機(jī)器帶來感知能力,而人工智能則通過計算算力為機(jī)器帶來了決策能力,正如感知和大腦對自然生命進(jìn)化所起到的必然性作用。

    1 數(shù)字圖像處理基礎(chǔ)知識

    https://hulin.blog.csdn.net/article/details/107570020

    2 彩色圖像處理初步

    https://hulin.blog.csdn.net/article/details/107578369

    3 空間濾波

    https://hulin.blog.csdn.net/article/details/107589248

    4 頻域濾波

    • 法國數(shù)學(xué)家傅里葉在《熱分析理論》中指出:任何周期函數(shù)都可以分解為不同頻率的正弦或余弦級數(shù)的形式,即傅里葉級數(shù)。該方法從本質(zhì)上完成了空間信息到頻域信息的變換,通過變換將空間域信號處理問題轉(zhuǎn)換成頻域信號處理問題。

    • 傅里葉變換可以將任何周期函數(shù),分解為不同頻率的信號成分。

    • 頻域變換為信號處理提供了不同的思路,有時在空間域無法處理的問題,通過頻域變換卻非常容易。

    • 為了更加有效的對數(shù)字圖像進(jìn)行處理,常常需要將原始圖像,以某種方式變換到另一個空間,并利用圖像在變換空間中特有的性質(zhì),對圖像信息進(jìn)行加工,然后再轉(zhuǎn)換回圖像空間,就可以得到所需的效果。

    • 圖像變換是雙向的,一般將從圖像空間轉(zhuǎn)換到其他空間的操作稱為正變換,由其他空間轉(zhuǎn)換到圖像空間稱為逆變換。

    • 傅里葉變換將圖像看作二維信號,其水平方向和垂直方向作為二維空間的坐標(biāo)軸,將圖像本身所在的域稱為空間域。

    • 圖像灰度值隨空間坐標(biāo)變換的節(jié)奏可以通過頻率度量,稱為空間頻率或者頻域。

    • 針對數(shù)字圖像的傅里葉變換是將原始圖像通過傅里葉變換轉(zhuǎn)換到頻域,然后再頻域中對圖像進(jìn)行處理的方法。

    • 基于傅里葉變換的數(shù)字圖像頻域處理過程:首先通過正向傅里葉變換將原始圖像從空間域轉(zhuǎn)換到頻域,然后使用頻域濾波器將某些頻率過濾,保留某些特定頻率,最后使用傅里葉逆變換將濾波后的頻域圖像重新轉(zhuǎn)換到空間域,得到處理后的圖像。

    • 相對于空間域圖像處理,頻域圖像處理有以下優(yōu)點。
      ① 頻域圖像處理可以通過頻域成分的特殊性質(zhì),完成一些空間域圖像處理難以完成的任務(wù)。
      ② 頻域圖像處理更有利于圖像處理的解釋,可以對濾波過程中產(chǎn)生的某些效果做出比較直觀的解釋。
      ③ 頻域濾波器可以作為空間濾波器設(shè)計的指導(dǎo),通過傅里葉逆變換可以將頻域濾波器轉(zhuǎn)換為空間域變換的操作。通過頻域濾波做前期設(shè)計,然后在實施階段,用空間域濾波實現(xiàn)。

    4.1 傅里葉變換

    • 傅里葉變換是一種常見的正交數(shù)學(xué)變換,可以將一維信號或函數(shù)分解為具有不同頻率、不同幅度的正弦信號或余弦信號的組合
    • 傅里葉變換的核心貢獻(xiàn)在于:如何求出每種正弦波或余弦波的比例或頻率,給定每種正弦波或余弦波的頻率可以恢復(fù)原始信號。
    • 一種簡單的傅里葉變換

    4.1.1 一維傅里葉變換

    • 傅里葉變換中,一般要求要求函數(shù)f(x)滿足狄力克雷條件(在周期內(nèi)存在有限個間斷點)、有限極值條件、絕對可積條件(∫?∞∞∣f(x)∣dx<+∞\int^{\infty}_{-\infty}|f(x)|dx<+\infty??f(x)dx<+),只有滿足這3個條件,函數(shù)的傅里葉變換才是存在的。

    • 一個函數(shù)的傅里葉變換可以表示為
      F(u)=∫?∞∞f(x)e?j2πuxdxF(u)=\int_{-\infty}^{\infty}f(x)e^{-j2\pi ux}dxF(u)=??f(x)e?j2πuxdx

    • 其對應(yīng)的傅里葉逆變換表示為
      f(u)=∫?∞∞F(u)ej2πuxduf(u)=\int_{-\infty}^{\infty}F(u)e^{j2\pi ux}duf(u)=??F(u)ej2πuxdu
      其中j=?1,uj=\sqrt{-1},uj=?1?,u為頻率分量

    • 傅里葉變換中基函數(shù)的物理意義非常明確,每個基函數(shù)都是一個單頻率諧波,對應(yīng)的系數(shù)(又稱頻譜)表明了原函數(shù)在此基函數(shù)上投影的大小,或者也可以看作是原函數(shù)中此種頻率諧波成分的比重。

    from matplotlib import pyplot as plt import numpy as np# 中文顯示工具函數(shù) def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch()def show(ori_func, sampling_period=5):n = len(ori_func)interval = sampling_period / n# 繪制原始函數(shù)plt.subplot(2, 1, 1)plt.plot(np.arange(0, sampling_period, interval), ori_func, 'black')plt.xlabel('時間'), plt.ylabel('振幅')plt.title('原始信號')# 繪制變換后的函數(shù)plt.subplot(2, 1, 2)frequency = np.arange(n / 2) / (n * interval)nfft = abs(ft[range(int(n / 2))] / n)plt.plot(frequency, nfft, 'red')plt.xlabel('頻率(Hz)'), plt.ylabel('頻譜')plt.title('傅里葉變換')plt.show()# 生成頻率為1,角速度為2*pi的正弦波 time = np.arange(0, 5, .005) x = np.sin(2 * np.pi * 1 * time) y = np.fft.fft(x) show(x, y)
    • 單一正弦波傅里葉變換結(jié)果

    4.1.2 二維傅里葉變換

    • 二維傅里葉變換本質(zhì)上是將一維傅里葉變換情形向二維進(jìn)行簡單擴(kuò)展。
    • 對應(yīng)二維傅里葉變換的逆變換可以表示為:
    from matplotlib import pyplot as plt import numpy as np from skimage import data# 中文顯示工具函數(shù) def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() img = data.camera() # 快速傅里葉變換得到頻率分布 f = np.fft.fft2(img) # 默認(rèn)結(jié)果中心點的位置是左上角,轉(zhuǎn)移到中間位置 fshift = np.fft.fftshift(f) # fft結(jié)果是復(fù)數(shù),求絕對值結(jié)果才是振幅 fimg = np.log(np.abs(fshift)) # 展示結(jié)果 plt.subplot(1, 2, 1), plt.imshow(img, 'gray'), plt.title('原始圖像') plt.subplot(1, 2, 2), plt.imshow(fimg, 'gray'), plt.title('傅里葉頻譜') plt.show()

    • 棋盤圖像對應(yīng)的傅里葉變換
    • 圖像經(jīng)傅里葉變換后,直流分量與圖像均值成正比,高頻分量則表明了圖像中目標(biāo)邊緣的強(qiáng)度及方向。

    4.2 傅里葉變換的性質(zhì)

    4.2.1 傅里葉變換的基本性質(zhì)

    ① 線性特性。
    傅里葉變換的線性特性可以表示為:若f1(t)?F1(Ω),f2(t)?F2(Ω),則 af1(t)+bf2(t)?aF1(Ω)+bF2(Ω)。其中a、b為任意常數(shù),利用傅里葉變換的線性特性,可以將待求信號分解為若干基本信號之和。
    ② 時延特性。
    時延(移位)特性說明波形在時間軸上時延,并不會改變信號幅度,僅使信號增加-Ωt0線性相位。

    • 時延移位對傅里葉頻譜的影響。

    ③ 頻移特性。
    頻移(調(diào)制)特性表明信號在時域中與復(fù)因子相乘,則在頻域中將使整個頻譜搬移Ω0。
    ④ 尺度變換。
    尺度特性說明,信號在時域中壓縮,在頻域中擴(kuò)展;反之,信號在時域中擴(kuò)展,在頻域中就一定壓縮,即信號的脈寬與頻寬成反比。一般來說,時寬有限的信號,其頻寬無限,反之亦然。

    • 針對門限函數(shù)的尺度變換及其傅里葉變換結(jié)果。

      ⑤ 時域微分特性。
      ⑥ 頻域微分特性。
      ⑦ 對稱性。
      ⑧ 時域卷積定理。
      ⑨ 頻域卷積定理。

    4.2.2 二維傅里葉變換的性質(zhì)

    相較于一維傅里葉變換,二維傅里葉變換還具有可分離性,平移特性,旋轉(zhuǎn)特性等。
    ① 可分離性。
    二維離散傅里葉變換(DFT),可視為由沿著x、y方向的兩個一維傅里葉變換所構(gòu)成。這一性質(zhì)可有效降低二維傅里葉變換的計算復(fù)雜性。

    from matplotlib import pyplot as plt import numpy as np from skimage import data, color# 中文顯示工具函數(shù) def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() img_rgb = data.coffee() img = color.rgb2gray(img_rgb) # 在X方向?qū)崿F(xiàn)傅里葉變換 m, n = img.shape fx = img for x in range(n):fx[:, x] = np.fft.fft(img[:, x]) for y in range(m):fx[y, :] = np.fft.fft(img[y, :]) # 默認(rèn)結(jié)果中心點位于左上角,轉(zhuǎn)移到中間位置 fshift = np.fft.fftshift(fx) # fft結(jié)果是復(fù)數(shù),求絕對值結(jié)果才是振幅 fimg = np.log(np.abs(fshift)) # 展示結(jié)果 plt.subplot(121), plt.imshow(img_rgb, 'gray'), plt.title('原始圖像') plt.subplot(122), plt.imshow(fimg, 'gray'), plt.title('兩次一維傅里葉變換的圖像') plt.show()


    ② 平移特性。
    f(x,y)在空間平移了,相當(dāng)于把傅里葉變換與一個指數(shù)相乘。f(x,y)在空間與一個指數(shù)項相乘,相當(dāng)于平移其傅里葉變換。
    ③ 旋轉(zhuǎn)特性。
    對f(x,y)旋轉(zhuǎn)一定角度,相當(dāng)于將其傅里葉變換F(u,v)旋轉(zhuǎn)一定角度。

    4.3 快速傅里葉變換

    • 離散傅里葉變換已成為數(shù)字信號處理的重要工具,然而其計算量大,運(yùn)算時間長,使用不夠廣泛。
    • 快速算法大大提高了其運(yùn)算速度,在某些應(yīng)用場合已經(jīng)可以做實時處理,并且應(yīng)用在控制系統(tǒng)中。
    • 快速傅里葉變換不是一種新的變換,是離散傅里葉變換的一種算法,是在分析離散傅里葉變換多余運(yùn)算的基礎(chǔ)上,消除這些重復(fù)工作的思想指導(dǎo)下得到的。

    4.3.1 快速傅里葉變換的原理

    • 離散傅里葉變換的計算時間主要由乘法決定,分解后所需的乘法次數(shù)大大減少。
    • 利用周期性和分解運(yùn)算,從而減少乘法運(yùn)算次數(shù)是實現(xiàn)快速運(yùn)算的關(guān)鍵。

    4.3.2 快速傅里葉變換的實現(xiàn)

    • 快速傅里葉變換的基本思想:快速傅里葉變換(FFT)基于逐次倍乘法(Successive Doubling Method)
    • 這個方法的主要思想是利用傅里葉變換(基底)的性質(zhì),將2M個數(shù)據(jù)的傅里葉變換轉(zhuǎn)化為2組M個數(shù)據(jù)的傅里葉變換。這樣,原來4*M*M的運(yùn)算量就降低到2*M*M的運(yùn)算量了。
    • 這樣就可以將原來比較復(fù)雜的傅里葉運(yùn)算,分解為兩個計算較簡單的傅里葉運(yùn)算。且還可以繼續(xù)分解,如此循環(huán)推到下去,直到最后剩下若干組兩個點對。

    4.4 圖像的頻域濾波

    • 圖像變換是對圖像信息進(jìn)行變換,使能量保持但重新分配,以利于加工處理,濾除噪聲等不必要的信息,加強(qiáng)、提取感興趣的部分或特征。
    • 傅里葉變換在圖像分析、濾波、增強(qiáng)、壓縮等處理中有非常重要的應(yīng)用。
    • 假定原圖像f(x,y)經(jīng)傅里葉變換為F(u,v),頻域增強(qiáng)就是選擇合適的濾波器函數(shù)H(u,v)對F(u,v)的頻譜成分進(jìn)行調(diào)整,然后經(jīng)傅里葉逆變換得到增強(qiáng)的圖像g(x,y)
    • 可以選擇合適的頻域傳遞函數(shù)H(u,v)突出f(x,y)某方面的特征,從而得到需要的圖像g(x,y).例如,利用傳遞函數(shù)突出高頻分量,以增強(qiáng)圖像的邊緣信息,即高通濾波。如果突出低頻分量,就可以使圖像顯得比較平滑,即低通濾波。
    • 頻域濾波的基本步驟如下。
      (1)對原始原圖像f(x,y)進(jìn)行傅里葉變換得到F(u,v)
      (2)將F(u,v)與傳遞函數(shù)H(u,v)進(jìn)行卷積運(yùn)算得到G(u,v)
      (3)將G(u,v)進(jìn)行傅里葉逆變換得到增強(qiáng)圖像g(x,y)
    • 頻域濾波的核心在于如何確定傳遞函數(shù)。

    4.4.1 低通濾波

    • 圖像從空間域變換到頻域后,其低頻分量對應(yīng)圖像中灰度值變化比較緩慢的區(qū)域,高頻分量表征物體的邊緣和隨機(jī)噪聲等信息。
    • 低頻濾波是指保留低頻分量,而通過濾波器函數(shù)H(u,v)減弱或抑制高頻分量,在頻域進(jìn)行濾波。
    • 低通濾波與空間域中的平滑濾波器一樣,可以消除圖像中的隨機(jī)噪聲,減弱邊緣效應(yīng),起到平滑圖像的作用。

    第一種 理想低通濾波器

    • 二維理想低通濾波器的傳遞函數(shù)如下。
    • 理想低通濾波器及其圖像
    from matplotlib import pyplot as plt import numpy as np from skimage import data, color# 中文顯示工具函數(shù) def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() D = 10 new_img = data.coffee() new_img = color.rgb2gray(new_img) # 傅里葉變換 f1 = np.fft.fft2(new_img) # 使用np.fft.fftshift()函數(shù)實現(xiàn)平移,讓直流分量輸出圖像的重心 f1_shift = np.fft.fftshift(f1) # 實現(xiàn)理想低通濾波器 rows, cols = new_img.shape crow, ccol = int(rows / 2), int(cols / 2) # 計算頻譜中心 mask = np.zeros((rows, cols), dtype='uint8') # 生成rows行,從cols列的矩陣,數(shù)據(jù)格式為uint8 # 將距離頻譜中心距離小于D的低通信息部分設(shè)置為1,屬于低通濾波 for i in range(rows):for j in range(cols):if np.sqrt(i * i + j * j) <= D:mask[crow - D:crow + D, ccol - D:ccol + D] = 1 f1_shift = f1_shift * mask # 傅里葉逆變換 f_ishift = np.fft.ifftshift(f1_shift) img_back = np.fft.ifft2(f_ishift) img_back = np.abs(img_back) img_back = (img_back - np.amin(img_back)) / (np.amax(img_back) - np.amin(img_back))plt.figure() plt.subplot(121) plt.imshow(new_img, cmap='gray') plt.title('原始圖像')plt.subplot(122) plt.imshow(img_back, cmap='gray') plt.title('濾波后的圖像') plt.show()
    • 二維圖像的理想低通濾波

    第二種 Butterworth低通濾波器

    • Butterworth低通濾波器的傳遞函數(shù)為

    • D0為截止頻率,n為函數(shù)的階。一般取使H(u,v)最大值下降到最大值的一半時的D(u,v)為截止頻率D0。

    • Butterworth低通濾波器的截面

    • 與理想低通濾波器相比,高低頻之間過度較為平滑,用此濾波器后的輸出圖像振鈴現(xiàn)象不明顯。

    • n=1時,過度最平滑,即尾部包含大量的高頻成分,所以一階Butterworth低通濾波器沒有振鈴現(xiàn)象;但隨著n的增加,振鈴現(xiàn)象會越來越明顯。

    from matplotlib import pyplot as plt import numpy as np from skimage import data, color# 中文顯示工具函數(shù) def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() img = data.coffee() img = color.rgb2gray(img) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 取絕對值后將復(fù)數(shù)變化為實數(shù) # 取對數(shù)的目的是將數(shù)據(jù)變換到0~255 s1 = np.log(np.abs(fshift))def ButterworthPassFilter(image, d, n):"""Butterworth低通濾波器"""f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transform_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))for i in range(transform_matrix.shape[0]):for j in range(transform_matrix.shape[1]):def cal_distance(pa, pb):from math import sqrtdis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)return disdis = cal_distance(center_point, (i, j))transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))return transform_matrixd_matrix = make_transform_matrix(d)new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))return new_imgplt.subplot(221) plt.axis('off') plt.title('Original') plt.imshow(img, cmap='gray')plt.subplot(222) plt.axis('off') plt.title('Butter D=100 n=1') butter_100_1 = ButterworthPassFilter(img, 100, 1) plt.imshow(butter_100_1, cmap='gray')plt.subplot(223) plt.axis('off') plt.title('Butter D=30 n=1') butter_30_1 = ButterworthPassFilter(img, 30, 1) plt.imshow(butter_30_1, cmap='gray')plt.subplot(224) plt.axis('off') plt.title('Butter D=30 n=5') butter_30_5 = ButterworthPassFilter(img, 30, 5) plt.imshow(butter_30_5, cmap='gray')plt.show()

    4.4.2 高通濾波

    • 圖像的邊緣、細(xì)節(jié)主要在高頻,圖像模糊的原因是高頻成分較弱。
    • 為了消除模糊,突出邊緣,可以采取高通濾波的方法,使低頻分量得到抑制,從而達(dá)到增強(qiáng)高頻分量,使圖像的邊緣或線條變得清晰,實現(xiàn)圖像的銳化。

    第一種 理想高通濾波

    • 理想高通濾波器的形狀與低通濾波器的形狀正好相反。

    • 理想高通濾波器及其圖像

    from matplotlib import pyplot as plt import numpy as np from skimage import data, color# 中文顯示工具函數(shù) def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() D = 10 new_img = data.coffee() new_img = color.rgb2gray(new_img) # numpy 中的傅里葉變換 f1 = np.fft.fft2(new_img) f1_shift = np.fft.fftshift(f1) """ 實現(xiàn)理想高通濾波器 start """ rows, cols = new_img.shape # 計算頻譜中心 crow, ccol = int(rows / 2), int(cols / 2) # 生成rows,cols列的矩陣,數(shù)據(jù)格式為uint8 mask = np.zeros((rows, cols), dtype='uint8') # 將距離頻譜中心距離小于D的低通信息部分設(shè)置為1,屬于低通濾波 for i in range(rows):for j in range(cols):if np.sqrt(i * i + j * j) <= D:mask[crow - D:crow + D, ccol - D:ccol + D] = 1mask = 1 - mask f1_shift = f1_shift * mask """ 實現(xiàn)理想高通濾波器 end """ # 傅里葉逆變換 f_ishift = np.fft.ifftshift(f1_shift) img_back = np.fft.ifft2(f_ishift) img_back = np.abs(img_back) img_back = (img_back - np.amin(img_back)) / (np.amax(img_back) - np.amin(img_back))plt.figure() plt.subplot(121) plt.axis('off') plt.imshow(new_img, cmap='gray') plt.title('原始圖像')plt.subplot(122) plt.axis('off') plt.imshow(img_back, cmap='gray') plt.title('過濾后的圖像') plt.show()
    • 二維圖像的理想高通濾波

    第二種 Butterworth高通濾波

    • Butterworth高通濾波器的形狀與Butterworth低通濾波器的形狀相反,因為高低頻率間平滑過渡,因此振鈴現(xiàn)象不明顯。
    from matplotlib import pyplot as plt import numpy as np from skimage import data, color# 中文顯示工具函數(shù) def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() img = data.coffee() img = color.rgb2gray(img) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 取絕對值后將復(fù)數(shù)變化為實數(shù) # 取對數(shù)的目的是將數(shù)據(jù)變換到0~255 s1 = np.log(np.abs(fshift))def ButterworthPassFilter(image, d, n):"""Butterworth 高通濾波器"""f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transform_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))for i in range(transform_matrix.shape[0]):for j in range(transform_matrix.shape[1]):def cal_distance(pa, pb):from math import sqrtdis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)return disdis = cal_distance(center_point, (i, j))transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))return transform_matrixd_matrix = make_transform_matrix(d)d_matrix = 1 - d_matrixnew_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))return new_imgplt.subplot(221) plt.axis('off') plt.title('Original') plt.imshow(img, cmap='gray')plt.subplot(222) plt.axis('off') plt.title('Butter D=100 n=1') butter_100_1 = ButterworthPassFilter(img, 100, 1) plt.imshow(butter_100_1, cmap='gray')plt.subplot(223) plt.axis('off') plt.title('Butter D=30 n=1') butter_30_1 = ButterworthPassFilter(img, 30, 1) plt.imshow(butter_30_1, cmap='gray')plt.subplot(224) plt.axis('off') plt.title('Butter D=30 n=5') butter_30_5 = ButterworthPassFilter(img, 30, 5) plt.imshow(butter_30_5, cmap='gray')plt.show()

    第三種 高頻增強(qiáng)濾波器

    • 高頻濾波將低頻分量濾掉,導(dǎo)致增強(qiáng)圖像中的邊緣得到加強(qiáng),但平坦區(qū)域灰度很暗,接近黑色。
    • 高頻增強(qiáng)濾波器對頻域里的高通濾波器的轉(zhuǎn)移函數(shù)加一個常數(shù),將一些低頻分量加回去,保持光滑區(qū)域的灰度,又改善邊緣區(qū)域的對比度。
    • 高頻增強(qiáng)轉(zhuǎn)移函數(shù)為He(u,v)=k*H(u,v)+c
    • 這樣就可以做到在原始圖像的基礎(chǔ)上疊加一些高頻成分,既保留了原圖的灰度層次,又銳化了邊緣
    from matplotlib import pyplot as plt import numpy as np from skimage import data, color# 中文顯示工具函數(shù) def set_ch():from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = Falseset_ch() img = data.coffee() img = color.rgb2gray(img) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 取絕對值后將復(fù)數(shù)變化為實數(shù) # 取對數(shù)的目的是將數(shù)據(jù)變換到0~255 s1 = np.log(np.abs(fshift))def ButterworthPassFilter(image, d, n):"""Butterworth 高通濾波器"""f = np.fft.fft2(image)fshift = np.fft.fftshift(f)def make_transform_matrix(d):transform_matrix = np.zeros(image.shape)center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))for i in range(transform_matrix.shape[0]):for j in range(transform_matrix.shape[1]):def cal_distance(pa, pb):from math import sqrtdis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)return disdis = cal_distance(center_point, (i, j))transform_matrix[i, j] = 1 / (1 + (dis / d) ** (2 * n))return transform_matrixd_matrix = make_transform_matrix(d)d_matrix = d_matrix+0.5new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))return new_imgplt.subplot(221) plt.axis('off') plt.title('Original') plt.imshow(img, cmap='gray')plt.subplot(222) plt.axis('off') plt.title('Butter D=100 n=1') butter_100_1 = ButterworthPassFilter(img, 100, 1) plt.imshow(butter_100_1, cmap='gray')plt.subplot(223) plt.axis('off') plt.title('Butter D=30 n=1') butter_30_1 = ButterworthPassFilter(img, 30, 1) plt.imshow(butter_30_1, cmap='gray')plt.subplot(224) plt.axis('off') plt.title('Butter D=30 n=5') butter_30_5 = ButterworthPassFilter(img, 30, 5) plt.imshow(butter_30_5, cmap='gray')plt.show()
    • 二維圖像的高頻增強(qiáng)濾波結(jié)果

    4.5 小結(jié)

    • 本章主要介紹頻域圖像處理,首先介紹了傅里葉變換及其基本性質(zhì),其次介紹了快速傅里葉變換,最后介紹了頻域濾波相關(guān)技術(shù)。

    參考資料

  • 岳亞偉《數(shù)字圖像處理與Python實現(xiàn)》人民郵電出版社
  • 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的数字图像处理与Python实现笔记之频域滤波的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。