一、高斯濾波器基礎知識
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