了解高斯濾波器

一、高斯濾波器基礎知識


def gaussian_filter(sigma, kernel_size):
    # 創建高斯核
    kernel = np.zeros([kernel_size, kernel_size])
    center = kernel_size // 2

    for i in range(kernel_size):
        for j in range(kernel_size):
            x, y = i - center, j - center
            # 計算高斯公式
            kernel[i, j] = np.exp(-(x ** 2 + y ** 2) / (2 * sigma ** 2))
            kernel_sum = np.sum(kernel)

    # 將核歸一化
    kernel /= kernel_sum

    return kernel

高斯濾波器(Gaussian Filter)是一種用於模糊圖像的線性濾波器。它可以迅速去除圖像中的噪點,同時使圖像變得更加平滑。高斯濾波器的運算利用了高斯函數作為權重,將像素周圍的值進行加權平均,具有平滑的效果。

高斯濾波器的主要參數是sigma和kernel_size。sigma表示高斯函數的標準差,kernel_size則表示濾波器的大小。之所以要使用高斯濾波器,是因為它在平滑圖像時可以達到相對較好的效果,同時運算速度也較快。

二、高斯濾波器的應用

高斯濾波器廣泛應用於計算機視覺領域。在圖像識別、目標檢測、分割等任務中,它能夠極大地提升圖像的質量和處理速度。下面介紹高斯濾波器在圖像處理中的幾個具體應用。

三、圖像去噪


import cv2

img = cv2.imread("test.jpg")
sigma = 5
kernel_size = 19

# 高斯濾波
blurred = cv2.GaussianBlur(img, (kernel_size, kernel_size), sigma)

cv2.imshow("Original image", img)
cv2.imshow("Blurred image", blurred)

cv2.waitKey(0)

高斯濾波器可以用於去除圖像中的大部分噪點。在這個例子中,使用OpenCV庫中的GaussianBlur函數對圖片進行高斯濾波,sigma和kernel_size均為超參數,用於確定濾波器的效果。

四、圖像邊緣檢測


def convolve(image, kernel):
    # 圖像矩陣、核矩陣的行列數
    image_row, image_col = image.shape
    kernel_row, kernel_col = kernel.shape
    # 計算 padding 大小
    pad = (kernel_row - 1) // 2
    # 定義一張新的圖像
    new_image = np.zeros(image.shape)
    # 將圖像填充
    padded_image = np.zeros((image_row + pad * 2, image_col + pad * 2))
    padded_image[pad:padding_row + pad, pad:image_col + pad] = image

    # 卷積操作
    for i in range(image_row):
        for j in range(image_col):
            new_image[i, j] = np.sum(kernel * padded_image[i:i + kernel_row, j:j + kernel_col])

    return new_image

image = cv2.imread("edge.jpg")
sigma = 5
kernel_size = 19

# 創建高斯濾波器
kernel = gaussian_filter(sigma, kernel_size)

# 圖像卷積得到濾波結果
blurred = convolve(image, kernel)

# 計算梯度值和方向
sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
sobel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]])

gradient_x = convolve(blurred, sobel_x)
gradient_y = convolve(blurred, sobel_y)

gradient_magnitude = np.sqrt(np.square(gradient_x) + np.square(gradient_y))
gradient_direction = np.arctan2(gradient_y, gradient_x)

cv2.imshow("Original image", image)
cv2.imshow("Blurred image", blurred)
cv2.imshow("X gradient", gradient_x)
cv2.imshow("Y gradient", gradient_y)
cv2.imshow("Gradient magnitude", gradient_magnitude)
cv2.imshow("Gradient direction", gradient_direction)

cv2.waitKey(0)

高斯濾波器可以用於圖像邊緣檢測。在該例子中,使用GaussianFilter函數得到一張濾波後的圖像。接着,使用卷積操作得到梯度值和方向,最終得到原圖像中的邊緣部分。

五、圖像細化


import cv2
import numpy as np

# 定義鄰域
neighborhood = np.array([
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]
], np.uint8)

# 定義骨架化函數
def skeletonize(image):
    # 記錄細化輪廓
    skeleton = np.zeros(image.shape, np.uint8)
    # 定義開運算
    open_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, neighborhood)

    while True:
        # 定義不同次數的腐蝕操作
        eroded = cv2.erode(image, neighborhood)
        temp = cv2.dilate(eroded, neighborhood)
        temp = cv2.subtract(image, temp)
        skeleton = cv2.bitwise_or(skeleton, temp)
        image = eroded.copy()

        if cv2.countNonZero(image) == 0:
            break

    return skeleton

# 讀取圖像並轉換成灰度圖像
image = cv2.imread("skel.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 進行閾值分割
_, threshold_image = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 對二值化圖像進行腐蝕操作得到骨架
skeleton = skeletonize(threshold_image)

cv2.imshow("Original image", image)
cv2.imshow("Skeleton image", skeleton)

cv2.waitKey(0)

高斯濾波器可以用於圖像細化,即骨架化。在該例子中,我們通過對灰度化後的圖像進行二值化操作,再對圖像進行腐蝕、膨脹、減法等操作,最終得到圖像的骨架。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/256424.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:40
下一篇 2024-12-15 12:40

相關推薦

  • 詳解OpenCV高斯濾波

    一、高斯濾波的介紹 OpenCV高斯濾波是一種平滑圖像的處理方法,通常用於去除噪聲、模糊化圖像等。它的原理是利用高斯函數進行加權平均,從而減少噪聲的干擾。 在圖像處理中,噪聲是一種…

    編程 2025-04-25
  • 高斯聚類詳解

    一、什麼是高斯聚類 高斯混合模型(Gaussian Mixture Model,GMM)是一種聚類算法,它將每個數據點看作是由多個高斯分布組成的混合,每個高斯分布代表了一個簇。通過…

    編程 2025-04-24
  • 高斯徑向基函數

    一、高斯徑向基函數參數意義 高斯徑向基函數是一種常用的插值方法,通過用高斯分布函數對每個數據點進行加權實現插值。在這個過程中,高斯徑向基函數有兩個極其重要的參數:中心點和半徑。 中…

    編程 2025-04-12
  • 粒子濾波器:探究與實踐

    粒子濾波器(Particle filter)是一種基於蒙特卡羅方法的狀態估計算法,被廣泛應用於目標跟蹤、機器人定位和導航等領域。本文將從三個方面來詳細探討粒子濾波器的相關概念、實現…

    編程 2025-01-02
  • 巴特沃斯高通濾波器

    一、巴特沃斯高通濾波器簡介 巴特沃斯高通濾波器是數字信號處理中常用的一種濾波器。它是一類遞歸濾波器,採用了完整的極點零點布局。 這種濾波器對於頻率大於一定值的信號,會進行濾波並將它…

    編程 2024-12-29
  • 隨機生成符合高斯分布的數字,讓你的數據更真實

    一、什麼是高斯分布 高斯分布,又叫正態分布,是概率論中非常重要的一個分布。在統計學、物理學、天文學等領域都有廣泛的應用。高斯分布的特點是,其隨機變量的概率密度函數呈鐘形曲線,且平均…

    編程 2024-12-28
  • c語言產生噪聲,c語言產生高斯白噪聲

    本文目錄一覽: 1、如何用c語言生成一個正態分布的樣本 2、用C語言描述產生泊松噪聲,N(numda)? 3、如何用C語言對圖像加入高斯噪聲和椒鹽噪聲? 4、急!!!請問各位高手:…

    編程 2024-12-28
  • Matlab Freqz – 詳解信號濾波器頻率響應

    一、介紹Matlab Freqz Matlab Freqz是Matlab Signal Processing Toolbox中用於分析信號濾波器頻率響應的函數之一。該函數是信號處理…

    編程 2024-12-26
  • 高斯愛學習java面試(高斯課堂java)

    本文目錄一覽: 1、通常java的面試都會問些什麼? 2、一般java面試都會問些什麼問題? 3、一般java面試都會問些什麼問題 通常java的面試都會問些什麼? 首先,你先向面…

    編程 2024-12-24
  • 巴特沃斯濾波器設計

    一、巴特沃斯濾波器設計原理 巴特沃斯濾波器是以英國數學家巴特沃斯(Chebyshev)的名字命名的一種濾波器,它是一種無限衝激響應(IIR)濾波器,可以用於實現各種濾波器類型,如低…

    編程 2024-12-22

發表回復

登錄後才能評論