從0到1學Python丨圖像平滑方法的兩種非線性濾波:中值濾波、雙邊濾波

来源:https://www.cnblogs.com/huaweiyun/archive/2022/12/15/16984405.html
-Advertisement-
Play Games

摘要:常用於消除雜訊的圖像平滑方法包括三種線性濾波(均值濾波、方框濾波、高斯濾波)和兩種非線性濾波(中值濾波、雙邊濾波),本文將詳細講解兩種非線性濾波方法。 本文分享自華為雲社區《[Python從零到壹] 五十六.圖像增強及運算篇之圖像平滑(中值濾波、雙邊濾波)》,作者:eastmount。 常用於 ...


摘要:常用於消除雜訊的圖像平滑方法包括三種線性濾波(均值濾波、方框濾波、高斯濾波)和兩種非線性濾波(中值濾波、雙邊濾波),本文將詳細講解兩種非線性濾波方法。

本文分享自華為雲社區《[Python從零到壹] 五十六.圖像增強及運算篇之圖像平滑(中值濾波、雙邊濾波)》,作者:eastmount。

常用於消除雜訊的圖像平滑方法包括三種線性濾波(均值濾波、方框濾波、高斯濾波)和兩種非線性濾波(中值濾波、雙邊濾波),本文將詳細講解兩種非線性濾波方法。

一.中值濾波

前面講述的都是線性平滑濾波,它們的中間像素值都是由鄰域像素值線性加權得到的,接下來將講解一種非線性平滑濾波——中值濾波。中值濾波通過計算每一個像素點某鄰域範圍內所有像素點灰度值的中值,來替換該像素點的灰度值,從而讓周圍的像素值更接近真實情況,消除孤立的雜訊。

中值濾波對脈衝雜訊有良好的濾除作用,特別是在濾除雜訊的同時,能夠保護圖像的邊緣和細節,使之不被模糊處理,這些優良特性是線性濾波方法所不具有的,從而使其常常被應用於消除圖像中的椒鹽雜訊[1-2]。

中值濾波演算法的計算過程如圖1所示。選擇含有五個點的視窗,依次掃描該視窗中的像素,每個像素點所對應的灰度值按照升序或降序排列,然後獲取最中間的值來替換該點的灰度值。

上圖展示的是矩形視窗,常用的視窗還包括正方形、十字形、環形和圓形等,不同形狀的視窗會帶來不同的過濾效果,其中正方形和圓形視窗適合於外輪廓邊緣較長的圖像,十字形視窗適合於帶尖角形狀的圖像。

OpenCV將中值濾波封裝在medianBlur()函數中,其函數原型如下所示:

  • dst = medianBlur(src, ksize[, dst])
    – src表示待處理的輸入圖像
    – dst表示輸出圖像,其大小和類型與輸入圖像相同
    – ksize表示內核大小,其值必須是大於1的奇數,如3、5、7等

下麵是調用medianBlur()函數實現中值濾波的代碼。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#讀取圖片
img = cv2.imread('lena-zs.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#中值濾波
result = cv2.medianBlur(source, 3)
#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']
#顯示圖形
titles = ['原始圖像', '中值濾波']
images = [source, result]
for i in range(2):
 plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
 plt.title(titles[i])
 plt.xticks([]),plt.yticks([])
plt.show()

其運行結果如圖2所示,它有效地過濾掉了“lena”圖中的雜訊,並且很好地保護了圖像的邊緣信息,使之不被模糊處理。

二.雙邊濾波

雙邊濾波(Bilateral filter)是由Tomasi和Manduchi在1998年發明的一種各向異性濾波,它一種非線性的圖像平滑方法,結合了圖像的空間鄰近度和像素值相似度(即空間域和值域)的一種折中處理,從而達到保邊去噪的目的。雙邊濾波的優勢是能夠做到邊緣的保護,其他的均值濾波、方框濾波和高斯濾波在去除雜訊的同時,都會有較明顯的邊緣模糊,對於圖像高頻細節的保護效果並不好[3]。

雙邊濾波比高斯濾波多了一個高斯方差sigma-d,它是基於空間分佈的高斯濾波函數。所以在圖像邊緣附近,離的較遠的像素點不會過於影響到圖像邊緣上的像素點,從而保證了圖像邊緣附近的像素值得以保存。但是雙邊濾波也存在一定的缺陷,由於它保存了過多的高頻信息,雙邊濾波不能有效地過濾掉彩色圖像中的高頻雜訊,只能夠對低頻信息進行較好地去噪[4]。

在雙邊濾波器中,輸出的像素值依賴於鄰域像素值的加權值組合,對輸入圖像進行局部加權平均得到輸出圖像 的像素值,其公式如下所示:

式中表示中心點(x,y)的(2N+1)×(2N+1)的領域像素,值依賴於領域像素值的加權平均。權重繫數取決於空間域核(domain)和值域核(range)的乘積。空間域核的定義如公式(2)所示。

值域核的定義如公式(3)所示。

兩者相乘之後,就會產生依賴於數據的雙邊濾波權重函數,如下所示:

從式子(4)可以看出,雙邊濾波器的加權繫數是空間鄰近度因數和像素亮度相似因數的非線性組合。前者隨著像素點與中心點之間歐幾里德距離的增加而減小,後者隨著像素亮度之差的增大而減小[5-6]。

在圖像變化平緩的區域,鄰域內亮度值相差不大,雙邊濾波器轉化為高斯低通濾波器;在圖像變化劇烈的區域,鄰域內像素亮度值相差較大,濾波器利用邊緣點附近亮度值相近的像素點的亮度平均值替代原亮度值。因此,雙邊濾波器既平滑了圖像,又保持了圖像邊緣,其原理圖如圖3所示。

OpenCV將中值濾波封裝在bilateralFilter()函數中,其函數原型如下所示:

  • dst = bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
    – src表示待處理的輸入圖像
    – dst表示輸出圖像,其大小和類型與輸入圖像相同
    – d表示在過濾期間使用的每個像素鄰域的直徑。如果這個值我們設其為非正數,則它會由sigmaSpace計算得出
    – sigmaColor表示顏色空間的標準方差。該值越大,表明像素鄰域內較遠的顏色會混合在一起,從而產生更大面積的半相等顏色區域
    – sigmaSpace表示坐標空間的標準方差。該值越大,表明像素的顏色足夠接近,從而使得越遠的像素會相互影響,更大的區域中相似的顏色獲取相同的顏色,當d>0,d指定了鄰域大小且與sigmaSpace無關。否則,d正比於sigmaSpace
    – borderType表示邊框模式,用於推斷圖像外部像素的某種邊界模式,預設值為BORDER_DEFAULT,可省略

下麵是調用bilateralFilter()函數實現雙邊濾波的代碼,其中d為15,sigmaColor設置為150,sigmaSpace設置為150。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#讀取圖片
img = cv2.imread('lena-zs.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#雙邊濾波
result = cv2.bilateralFilter(source, 15, 150, 150)
#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']
#顯示圖形
titles = ['原始圖像', '雙邊濾波'] 
images = [source, result]
for i in range(2):
 plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')
 plt.title(titles[i])
 plt.xticks([]),plt.yticks([])
plt.show()

其運行結果如圖4所示:

三.總結

本文主要講解了常用於消除雜訊的圖像平滑方法,常見方法包括三種線性濾波(均值濾波、方框濾波、高斯濾波)和兩種非線性濾波(中值濾波、雙邊濾波)。這篇文章介紹了中值濾波和雙邊濾波,通過原理和代碼進行對比,分別講述了各種濾波方法的優缺點,有效地消除了圖像的雜訊,並保留圖像的邊緣輪廓。

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux常用命令 1、 關機/重啟/註銷 | 常用命令 | 作用 | | | | | shutdown -h now | 即刻關機 | | shutdown -h 10 | 10分鐘後關機 | | shutdown -h 11:00 | 11:00關機 | | shutdown -h +10 | ...
  • 最近在複習以前學習的python爬蟲內容,就拿微博來練了一下手,這個案例適合學習爬蟲到中後期的小伙伴,因為他不是特別簡單也不是很難,關鍵是思路,為什麼說不是很難呢?因為還沒涉及到js逆向,好了話不多說開乾。 (1)找到要爬取的頁面,如下: (2)點開評論,拉到最下方,如下位置: 點擊“點擊查看”進入 ...
  • 來源:developer.aliyun.com/article/889271 本文準備圍繞七個點來講網關,分別是網關的基本概念、網關設計思路、網關設計重點、流量網關、業務網關、常見網關對比,對基礎概念熟悉的朋友可以根據目錄查看自己感興趣的部分。 什麼是網關 網關,很多地方將網關比如成門, 沒什麼問題 ...
  • 無論是要交給程式處理的數據,還是控制腳本的簡單命令,都少不了輸入和輸出。程式要做的第一件事就是處理如同一陰一陽的“輸入與輸出”。 1 、從文件獲取輸入 當我們希望向文件輸出內容時,我們可以通過符號 > 或 >> 實現。而用代表輸入重定向的符號 < 可以從文件中讀取數據,如下: $ wc < my.f ...
  • 作者:張富春(ahfuzhang),轉載時請註明作者和引用鏈接,謝謝! cnblogs博客 zhihu Github 公眾號:一本正經的瞎扯 我在多進程插件框架 hashicorp/go-plugin 的基礎上,使用 protoreflect 來解析 proto3 語法的IDL文件,通過命令行工具自 ...
  • 解決問題 在SpringBoot項目中,如何集成Karate測試框架和Jacoco插件。以及編寫了feature測試文件,怎麼樣配置才能看到被測試介面代碼的覆蓋率。 演示版本及說明 本次講解,基於SpringBoot2.1.4.RELEASE版本,可根據項目版本靈活更改。下麵所有的版本號,可以自行選 ...
  • 查找 假設有如下這樣一個有序鏈表: 想要查找 24、43、59,按照順序遍歷,分別需要比較的次數為 2、4、6 目前查找的時間複雜度是 O(N),如何提高查找效率? 很容易想到二分查找,將查找的時間複雜度降到 O(LogN) 具體來說,我們把鏈表中的一些節點提取出來,作為索引,類似於二叉搜索樹,得到 ...
  • “好記性不如爛筆頭。” —— 張溥 0x00 大綱 0x01 前言 部分內容翻譯自 ZooKeeper 3.6 Documentation,文末附原文章節,可對照理解。 0x02 獨立運行 在獨立模式下設置 ZooKeeper 服務很簡單。服務包含在單個 JAR 文件中,因此安裝包括創建配置。 下載 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...