一. 差分滤波器
差分滤波器对于图像亮度急剧变化的边缘有提取效果,可以获得邻近像素的差值。
二. 差分滤波器形式
三. python实现差分滤波器
实验:实现上述三个差分滤波器,并作用于图像,查看图像各个方向上信息提取效果
import cv2
import numpy as np
# Gray scale
def BGR2GRAY(img):
b = img[:, :, 0].copy()
g = img[:, :, 1].copy()
r = img[:, :, 2].copy()
# Gray scale
out = 0.2126 * r + 0.7152 * g + 0.0722 * b
out = out.astype(np.uint8)
return out
# different filter
def different_filter(img, K_size=3):
H, W = img.shape
# Zero padding
pad = K_size // 2
out = np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
out[pad: pad + H, pad: pad + W] = img.copy().astype(np.float)
tmp = out.copy()
out_v = out.copy()
out_h = out.copy()
out_d = out.copy()
# vertical kernel
Kv = [[0., -1., 0.],[0., 1., 0.],[0., 0., 0.]]
# horizontal kernel
Kh = [[0., 0., 0.],[-1., 1., 0.], [0., 0., 0.]]
# diagonal kernel
Kd = [[-1.,0.,0.],[0.,1.,0.],[0.,0.,0.]]
# filtering
for y in range(H):
for x in range(W):
out_v[pad + y, pad + x] = np.sum(Kv * (tmp[y: y + K_size, x: x + K_size]))
out_h[pad + y, pad + x] = np.sum(Kh * (tmp[y: y + K_size, x: x + K_size]))
out_d[pad + y, pad + x] = np.sum(Kd * (tmp[y: y + K_size, x: x + K_size]))
out_v = np.clip(out_v, 0, 255)
out_h = np.clip(out_h, 0, 255)
out_d = np.clip(out_d, 0, 255)
out_v = out_v[pad: pad + H, pad: pad + W].astype(np.uint8)
out_h = out_h[pad: pad + H, pad: pad + W].astype(np.uint8)
out_d = out_d[pad: pad + H, pad: pad + W].astype(np.uint8)
return out_v, out_h, out_d
# Read image
img = cv2.imread("../gezi.jpg").astype(np.float)
# grayscale
gray = BGR2GRAY(img)
# different filtering
out_v, out_h,out_d = different_filter(gray, K_size=3)
# Save result
cv2.imwrite("out_v.jpg", out_v)
cv2.imshow("result_v", out_v)
cv2.imwrite("out_h.jpg", out_h)
cv2.imshow("result_h", out_h)
cv2.imwrite("out_d.jpg", out_d)
cv2.imshow("result_d", out_d)
cv2.waitKey(0)
cv2.destroyAllWindows()
四. 实验结果
可以看到,实验结果如我们之前判断的那样,水平差分滤波器检测出了图像中的竖直特征;竖直差分滤波器检测出了图像中的水平特征;对角线(左上>右下)差分滤波器检测出了图像的对角线(左下>右上)特征。
五. 参考材料: