一. 差分濾波器
差分濾波器對於圖像亮度急劇變化的邊緣有提取效果,可以獲得鄰近像素的差值。
二. 差分濾波器形式
豎直差分濾波器 ↑
水平差分濾波器 ↑
對角線差分濾波器 ↑
三. 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()
四. 實驗結果
原圖 ↑
水平差分濾波器作用結果 ↑
豎直差分濾波器作用結果 ↑
對角線(左上>右下)差分濾波器作用結果 ↑
可以看到,實驗結果如我們之前判斷的那樣,水平差分濾波器檢測出了圖像中的豎直特征;豎直差分濾波器檢測出了圖像中的水平特征;對角線(左上>右下)差分濾波器檢測出了圖像的對角線(左下>右上)特征。
五. 參考材料:
