[Python][OpenCV]自適應中值濾波

更新於 2024/12/02閱讀時間約 7 分鐘

中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。

後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於標準中值濾波的擴展,並結合了自適應算法的思想。

核心概念

  • 標準中值濾波:對於一個像素,考察它周圍一定窗口內的所有像素值,並以其中的中值取代中心像素值。
  • 自適應中值濾波:動態調整窗口大小,以更好地處理圖像中的雜訊和邊緣,避免過度平滑。

主要特性

  1. 自適應中值濾波根據雜訊密度自適應地調整濾波窗口的大小。
  2. 能夠有效保護圖像的邊緣和細節,同時消除椒鹽雜訊。

窗口大小

標準中值濾波器

  • 窗口大小固定(如 3×33×3)。
  • 窗口越大,去噪效果越強,但細節損失也越多。

自適應中值濾波器

  • 窗口大小隨噪聲情況動態調整,最小窗口大小通常為 3×33×3,最大窗口大小為 k×kk×k(如 7×77×7 或 11×1111×11)。
  • 自適應窗口能夠平衡去噪和細節保留。


加入椒鹽雜訊來測試自適應中值濾波與中值濾波差異

raw-image

自適應中值濾波與中值濾波的差異

自適應濾波處理的結果明顯比中值濾波好上很多,但處理時間也是多了非常多。

raw-image
raw-image



自適應中值濾波程式碼

import cv2

import numpy as np

def adaptive_median_filter(image, max_kernel_size=7):

"""

自適應中值濾波器

:param image: 輸入的灰階圖像

:param max_kernel_size: 最大的窗口大小

:return: 濾波後的圖像

"""

# 獲取圖像的尺寸

height, width = image.shape

# 創建輸出圖像

output_image = image.copy()

# 中值濾波的核心

for i in range(1, height - 1):

for j in range(1, width - 1):

# 設定初始窗口大小

kernel_size = 3

while kernel_size <= max_kernel_size:

# 提取窗口區域

x_start = max(i - kernel_size // 2, 0)

x_end = min(i + kernel_size // 2 + 1, height)

y_start = max(j - kernel_size // 2, 0)

y_end = min(j + kernel_size // 2 + 1, width)

# 擷取窗口的區域

window = image[x_start:x_end, y_start:y_end]

# 計算窗口中的中位數

median = np.median(window)

# 如果原像素值與中位數差異過大,則替換

if abs(image[i, j] - median) > 0:

output_image[i, j] = median

break

else:

# 如果當前窗口的中位數已經可以接受,則不再增加窗口大小

if kernel_size == max_kernel_size:

break

kernel_size += 2 # 增加窗口的大小

return output_image

# 使用範例

image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)

output_image = adaptive_median_filter(image, max_kernel_size=7)

# 顯示結果

cv2.imshow("Adaptive Median Filter", output_image)

cv2.waitKey(0)

cv2.destroyAllWindows()

程式碼詳細解釋:

  1. kernel_size:這是濾波器使用的窗口大小,開始時為3,然後每次增加2直到達到最大大小 max_kernel_size
  2. np.median(window):這是計算當前窗口內的中位數,這對於去除椒鹽噪聲非常有效。
  3. abs(image[i, j] - median) > 0:這個條件用來檢查當前像素值和中位數的差距。如果差距大,則將像素值替換為中位數,否則嘗試增大窗口。

參數:

  • max_kernel_size:這是最大窗口大小。可以根據圖像的大小和噪聲的情況進行調整。如果圖像噪聲較大,可以選擇較大的窗口。

優點:

  • 去噪聲:自適應中值濾波非常適合去除椒鹽噪聲。
  • 邊緣保護:由於濾波器會根據圖像內容調整窗口大小,它不會過度模糊細節,對邊緣保護效果較好。

缺點:

  • 計算時間:圖像尺寸越大,像素數量越多,濾波處理需要的計算次數也越多,計算時間呈線性增加

可能的改進:

  • 增加閾值:可以設定一些條件來判斷何時應該調整窗口大小,這樣可以更精確地控制噪聲去除過程。



avatar-img
128會員
209內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
cv2.fastNlMeansDenoising() 是 OpenCV 中一個非常有效的去噪函數,基於非局部均值濾波算法(Non-Local Means Filtering)。它能夠有效地去除圖像中的隨機噪聲(如高斯噪聲),並保留圖像的細節,特別適合處理含有隨機噪聲的圖像,如拍攝時產生的感光元件噪聲
當影像中有雜訊時,使用直方圖均衡化來增強對比就會受雜訊的影響,從而影響到整體的結果。應對這個問題,可以考慮使用自適應直方圖均衡化來減少雜訊的影響,並增強對比度。 本文將比較直方圖均衡化與自適應直方圖均衡化的差異性。 [OpenCV基礎][Python]影像增強_直方圖均衡處理 直方圖均衡化的
在 OpenCV 中,將圖片從 BGR 色彩空間轉換為灰階圖像時常用cv2.COLOR_BGR2GRAY ,此函數使用了特定的權重來計算灰階值。這些權重是基於人眼對不同顏色的敏感度進行調整的。 Gray=0.299×R+0.587×G+0.114×B 本文介紹了用其他方式來提取色彩通道
cv2.countNonZero 是 OpenCV 中的一個函數,用來計算二值圖像(或單通道圖像)中非零像素的數量。這個函數對於圖像處理中的許多操作非常有用,例如計算某個區域內的白色像素數量,從而幫助我們了解圖像的內容或進行進一步的分析。 使用範例 假設您有一個二值圖像,其中白色像素
局部二值化(Local Thresholding)是一種影像處理技術,用來根據局部區域的像素值動態地將影像轉換為二值影像。這在處理光照不均勻的影像時特別有用。 與常見的兩種二值化(Otsu's與固定閥值)方法做比較。 實現局部二值化的範例: import cv2 import numpy
在影像處理中,形態學操作是非常重要的一種技術,能夠幫助我們去除噪點、強化特徵、修復物體的形狀等。形態學操作的核心是「結構元素」(kernel),不同形狀的結構元素會產生不同的處理效果。本文將介紹如何使用不同形狀的結構元素來進行圖像處理,並結合實際程式範例和測試圖片來說明其效果。
cv2.fastNlMeansDenoising() 是 OpenCV 中一個非常有效的去噪函數,基於非局部均值濾波算法(Non-Local Means Filtering)。它能夠有效地去除圖像中的隨機噪聲(如高斯噪聲),並保留圖像的細節,特別適合處理含有隨機噪聲的圖像,如拍攝時產生的感光元件噪聲
當影像中有雜訊時,使用直方圖均衡化來增強對比就會受雜訊的影響,從而影響到整體的結果。應對這個問題,可以考慮使用自適應直方圖均衡化來減少雜訊的影響,並增強對比度。 本文將比較直方圖均衡化與自適應直方圖均衡化的差異性。 [OpenCV基礎][Python]影像增強_直方圖均衡處理 直方圖均衡化的
在 OpenCV 中,將圖片從 BGR 色彩空間轉換為灰階圖像時常用cv2.COLOR_BGR2GRAY ,此函數使用了特定的權重來計算灰階值。這些權重是基於人眼對不同顏色的敏感度進行調整的。 Gray=0.299×R+0.587×G+0.114×B 本文介紹了用其他方式來提取色彩通道
cv2.countNonZero 是 OpenCV 中的一個函數,用來計算二值圖像(或單通道圖像)中非零像素的數量。這個函數對於圖像處理中的許多操作非常有用,例如計算某個區域內的白色像素數量,從而幫助我們了解圖像的內容或進行進一步的分析。 使用範例 假設您有一個二值圖像,其中白色像素
局部二值化(Local Thresholding)是一種影像處理技術,用來根據局部區域的像素值動態地將影像轉換為二值影像。這在處理光照不均勻的影像時特別有用。 與常見的兩種二值化(Otsu's與固定閥值)方法做比較。 實現局部二值化的範例: import cv2 import numpy
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
在文字辨識中,適當的增加一文字彼此間的間隔是有幫助於辨識的,原因在大多數OCR引擎在處理字符時會依賴空白區域來區分不同的字符。如果字符之間的間隔過小,OCR引擎可能會將相鄰的字符誤認為一個單一的字符或難以正確切割字符。增加間隔可以幫助OCR引擎更準確地識別和切割每個字符。 本文說明如何增加OCR間
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
濾鏡的使用是輸入一張原始圖片,按上吉卜力的濾鏡按鈕,就會產生一張很像宮崎駿畫風的圖片。主題會是你拍照的元素或是AI繪圖產生的畫面。 使用濾鏡的畫面,大概完成了百分之八十,根據這個畫面用途加以人工修圖。 例如:用於學校的系所海報,來增加學生的學習意願,畫面不需要這些字,那就必須使用手繪軟體
Thumbnail
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
Thumbnail
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
呈上篇文章,針對單排的圖像文字增加間隔,但如果文字是雙排呢 [OpenCV][Python]OCR分割及增加間隔[單排文字]
Thumbnail
在文字辨識中,適當的增加一文字彼此間的間隔是有幫助於辨識的,原因在大多數OCR引擎在處理字符時會依賴空白區域來區分不同的字符。如果字符之間的間隔過小,OCR引擎可能會將相鄰的字符誤認為一個單一的字符或難以正確切割字符。增加間隔可以幫助OCR引擎更準確地識別和切割每個字符。 本文說明如何增加OCR間
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
在影像處理中,有時候我們只想特別關注某個感興趣的區域時,就是ROI的概念,擷取此範圍的圖像來做處理。 設定超過圖像邊界時就會報錯,本文主要介紹如何擷取影像的同時,避免設定錯誤造成程式崩潰的狀況。 擷取圖像示意圖 ROI程式範例 import cv2 import numpy as np
Thumbnail
在影像辨識中,若遇到物件與背景難以分辨的狀況下,先做一下色彩分析,知道了色彩強度階層上的像素數,有助於了解後續需要做什麼處理,比較好分割出辨識物。 若想辨識的物件與背景的RGB值過於接近,也比較好說明此狀況,為什麼較難分割出物件。 成果呈現 第一張圖:左邊為原圖,右邊為分析結果的圖,用其他顏
Thumbnail
濾鏡的使用是輸入一張原始圖片,按上吉卜力的濾鏡按鈕,就會產生一張很像宮崎駿畫風的圖片。主題會是你拍照的元素或是AI繪圖產生的畫面。 使用濾鏡的畫面,大概完成了百分之八十,根據這個畫面用途加以人工修圖。 例如:用於學校的系所海報,來增加學生的學習意願,畫面不需要這些字,那就必須使用手繪軟體
Thumbnail
常見的圖像銳利化方法: 銳化濾波器 增強對比度 Unsharp Masking
Thumbnail
形態學操作在影像處理中有多種應用,特別是在處理二值化影像(黑白影像)。 在影像處理應用上,基本上都由侵蝕,膨脹這兩種方法,組合搭配而成。 常見應用場景 物體檢測與分割: 形態學操作可以用於增強或改善二值化影像中的物體邊界,使得物體的檢測和分割更加準確。
Thumbnail
[影像處理_OpenCV Python]使用Python撰寫影像處理功能,圖片遮罩或濾除掉不要的地方,旋轉圖片 以下範例將呈現影像處理三種不同的應用: 遮罩的實現 濾除 旋轉