挑战图像处理100问(19)——LoG滤波器

在这里插入图片描述

LoG滤波器

LoG即高斯-拉普拉斯(Laplacian of Gaussian)的缩写,使用高斯滤波器使图像平滑化之后再使用拉普拉斯滤波器使图像的轮廓更加清晰。

为了防止拉普拉斯滤波器计算二次微分会使得图像噪声更加明显,所以我们首先使用高斯滤波器来抑制噪声。

LoG 滤波器使用以下式子定义:
LoG ( x , y ) = x 2 + y 2 s 2 2   π   s 6   e x 2 + y 2 2   s 2 \text{LoG}(x,y)=\frac{x^2 + y^2 - s^2}{2 \ \pi \ s^6} \ e^{-\frac{x^2+y^2}{2\ s^2}}

代码实现
import cv2 # 我只用它来做图像读写和绘图,没调用它的其它函数哦
import numpy as np # 进行数值计算
from numpy import random # numpy中的随机函数

# LoG滤波函数
def LoG_filter(img, K_size=3, K_sigma=3):
	# 获取图片尺寸
	
	H, W, C = img.shape

	# 图像边缘补零
	pad = K_size // 2 # 使图像边缘能与滤波器中心对齐
	out = np.zeros((H+2*pad, W+2*pad, C), dtype=np.float)
	out[pad:pad+H, pad:pad+W] = img.copy().astype(np.float)

	# 滤波器系数设置
	K = np.zeros((K_size, K_size), dtype=np.float)
	for x in range(-pad, -pad+K_size):
		for y in range(-pad, -pad+K_size):
			K[y + pad, x + pad] = (x ** 2 + y ** 2 - K_sigma ** 2) * np.exp( -(x ** 2 + y ** 2) / (2 * (K_sigma ** 2)))

	K /= (2 * np.pi * (K_sigma ** 6))
	# 归一化
	K /= K.sum()

	tmp = out.copy()

	# 进行滤波
	for h in range(H):
		for w in range(W):
			out[pad + y, pad + x] = np.sum(K * tmp[y: y + K_size, x: x + K_size])

	out = np.clip(out, 0, 255)
	out = out[pad: pad + H, pad: pad + W].astype(np.uint8)

	return out

# 读取图片
path = 'C:/Users/86187/Desktop/image/'


file_in = path + 'cake.jpg' 
file_out = path + 'LoG_filter.jpg' 
img = cv2.imread(file_in)

# 获取图片尺寸
size = img.shape

# 创建一幅同样大小的噪声图加到原图像上
img_noise = 20 * random.standard_normal(size) #乘以20是为了让噪声看起来大一些
img = img + img_noise

cv2.imwrite(path+'cake_noise.jpg', img)

# 调用函数进行LoG滤波
out = LoG_filter(img, K_size=3, K_sigma=3)
# 保存图片
cv2.imwrite(file_out, out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果展示
原图 加噪声 LoG滤波
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
发布了54 篇原创文章 · 获赞 54 · 访问量 2508

猜你喜欢

转载自blog.csdn.net/qq_42662568/article/details/105501139