差分滤波器(Differential Filter)
Author: Tian YJ
原图如下:
差分滤波器对图像亮度急剧变化的边缘有提取效果,可以获得邻接像素的差值。
纵向:(用于提取图像的水平线条)
横向:(用于提取图像的竖直线条)
对角线:(用于提取图像的对角线线条)
-
纵向:在滤波器中,取范围内中心点的值和上方的值,两者之差填入中心点
-
横向:在滤波器中,取范围内中心点的值和左方的值,两者之差填入中心点
-
注意:有可能用较大值减去较小值。比如:180-181 = -1,由于数据类型是uint8,自动变成255,所以要取相减之后的绝对值。
代码实现
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 9 16:50:21 2020
@author: Tian YJ
"""
import cv2 # 我只用它来做图像读写和绘图,没调用它的其它函数哦
import numpy as np # 进行数值计算
# 定义差分滤波器函数
def different_filter(img, K_size=3):
# 获取图像尺寸
H, W, C = img.shape
# padding
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_v = np.array([[0,-1,0], [0,1,0], [0,0,0]])
# 横向滤波器系数
K_h = np.array([[0,0,0], [-1,1,0], [0,0,0]])
# 进行滤波
tem = out.copy()
out_v = out.copy()
out_h = out.copy()
for h in range(H):
for w in range(W):
for c in range(C):
out_v[pad+h, pad+w, c] = np.sum(K_v * tem[h:h+K_size, w:w+K_size, c], dtype=np.float)
out_h[pad+h, pad+w, c] = np.sum(K_h * tem[h:h+K_size, w:w+K_size, c], dtype=np.float)
out_v = np.clip(out_v, 0, 255)
out_h = np.clip(out_h, 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)
return out_v, out_h
# 这里需要把图像先灰度化
# 直接用之前的灰度化代码
# 灰度化函数
def BGR2GRAY(img):
# 获取图片尺寸
H, W, C = img.shape
# 灰度化
out = np.ones((H,W,3))
for i in range(H):
for j in range(W):
out[i,j,:] = 0.299*img[i,j,0] + 0.578*img[i,j,1] + 0.114*img[i,j,2]
out = out.astype(np.uint8)
return out
# 读取图片
path = 'C:/Users/86187/Desktop/image/'
file_in = path + 'cake.jpg'
file_out_1 = path + 'different_filter_v.jpg'
file_out_2 = path + 'different_filter_h.jpg'
img = cv2.imread(file_in)
# 调用函数进行灰度化
img = BGR2GRAY(img)
# 调用函数进行差分滤波
out = different_filter(img)
# 保存图片
# 纵向
cv2.imwrite(file_out_1, out[0])
cv2.imshow("result", out[0])
# 横向
cv2.imwrite(file_out_2, out[1])
cv2.imshow("result", out[1])
cv2.waitKey(0)
cv2.destroyAllWindows()
结果展示
原图 | 纵向差分 | 横向差分 |
---|---|---|
为什么我感觉看着不明显,换个图试试!
原图 | 纵向差分 | 横向差分 |
---|---|---|
哈哈,这下结果就一目了然了。