Mahotas - 高斯濾波



高斯濾波是一種用於模糊或平滑影像的技術。它可以減少影像噪聲並軟化銳利邊緣。

想象一下你的影像是一個由許多小點組成的網格,每個點代表一個畫素。高斯濾波透過獲取每個畫素並根據周圍畫素調整其值來工作。

它計算其鄰域中畫素值的加權平均值,對較近的畫素給予更多重視,對較遠的畫素給予較少重視。

透過對影像中每個畫素重複此過程,高斯濾波器透過平滑不同區域之間的急劇過渡和減少噪聲來模糊影像。

濾波器的大小決定了模糊的程度。較大的濾波器尺寸意味著考慮的區域更廣,從而導致更明顯的模糊。

簡單來說,高斯濾波透過平均附近的畫素值使影像看起來更平滑,對較近的畫素給予更多重視,對較遠的畫素給予較少重視。這有助於減少噪聲並使影像不那麼銳利。

Mahotas中的高斯濾波

在Mahotas中,我們可以使用mahotas.gaussian_filter()函式對影像執行高斯濾波。此函式透過使用稱為高斯核的特殊矩陣來對影像應用模糊效果。

高斯核是一個特殊的矩陣,其數字以特定方式排列。核中的每個數字代表一個權重。

將核放置在影像中的每個畫素上,並且相鄰畫素的值與其在核中的相應權重相乘。

然後將相乘的值相加,並將其賦值為中心畫素的新值。對影像中的每個畫素重複此過程,從而產生模糊的影像,其中減少了銳利細節和噪聲。

mahotas.gaussian_filter()函式

mahotas.gaussian_filter()函式以灰度影像作為輸入,並返回影像的模糊版本作為輸出。

模糊的程度由sigma值決定。sigma值越高,應用於輸出影像的模糊程度就越大。

語法

以下是mahotas中gaussian_filter()函式的基本語法:

mahotas.gaussian_filter(array, sigma, order=0, mode='reflect', cval=0.,
out={np.empty_like(array)})

其中:

  • array - 輸入影像。

  • sigma - 決定高斯核的標準差。

  • order (可選) - 指定高斯濾波器的階數。其值可以是0、1、2或3(預設為0)。

  • mode (可選) - 指定如何處理邊界(預設為'reflect')。

  • cval (可選) - 當mode為'constant'時應用的填充值(預設為0)。

  • out (可選) - 指定儲存輸出影像的位置(預設為與array相同大小的陣列)。

示例

在下面的示例中,我們使用mh.gaussian_filter()函式對影像應用高斯濾波。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('tree.tiff')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Applying gaussian filtering
gauss_filter = mh.gaussian_filter(image, 4)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the gaussian filtered image
axes[1].imshow(gauss_filter)
axes[1].set_title('Gaussian Filtered Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
輸出

以下是上述程式碼的輸出:

Gaussian Filtering

不同階數的濾波

我們可以對影像進行不同階數的高斯濾波。高斯濾波中的階數決定了應用於影像的平滑度(模糊度)。

階數越高,應用於影像的平滑效果就越大。

處理非常嘈雜的影像時,較高的階數很有用。但是,較高的階數也會增加處理時間,因為濾波器會多次應用。

0階應用高斯濾波器一次,1、2或3階分別應用高斯濾波器兩次、三次和四次。

在mahotas中,要進行不同階數的高斯濾波,我們將0以外的任何值作為order引數傳遞給gaussian_filter()函式。

示例

在下面提到的示例中,我們對影像應用不同階數的高斯濾波。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('sea.bmp')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Applying gaussian filtering
gauss_filter = mh.gaussian_filter(image, 3, 1)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the gaussian filtered image
axes[1].imshow(gauss_filter)
axes[1].set_title('Gaussian Filtered Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

輸出

上述程式碼的輸出如下:

Filtering Different Order

'Mirror'模式下的濾波

將濾波器應用於影像時,確定如何處理影像的邊界非常重要。“映象”模式是一種常見的方法,它透過映象邊界處的影像內容來處理邊界畫素。

這意味著影像邊界之外的值是透過映象影像內最近的畫素獲得的。這是透過沿邊緣映象現有畫素來完成的。

這種映象技術確保了實際影像和映象影像之間平滑的過渡,從而產生更好的連續性。

示例

在這裡,我們使用“映象”模式對影像應用高斯濾波。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('sun.png')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Applying gaussian filtering
gauss_filter = mh.gaussian_filter(image, 3, 0, mode='mirror')
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the gaussian filtered image
axes[1].imshow(gauss_filter)
axes[1].set_title('Gaussian Filtered Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

輸出

執行上述程式碼後,我們將獲得以下輸出:

Filtering Different Order1
廣告