挑战图像处理100问(14)——差分滤波器

在这里插入图片描述

差分滤波器(Differential Filter)

Author: Tian YJ
原图如下:

在这里插入图片描述
差分滤波器对图像亮度急剧变化的边缘有提取效果,可以获得邻接像素的差值。

纵向:(用于提取图像的水平线条)
K=[010010000] K=left[ egin{matrix} 0&-1&0\ 0&1&0\ 0&0&0 end{matrix} ight]
横向:(用于提取图像的竖直线条)
K=[000110000] K=left[ egin{matrix} 0&0&0\ -1&1&0\ 0&0&0 end{matrix} ight]
对角线:(用于提取图像的对角线线条)
K=[100010000] K=left[ egin{matrix} -1&0&0\ 0&1&0\ 0&0&0 end{matrix} ight]

  1. 纵向:在滤波器中,取范围内中心点的值和上方的值,两者之差填入中心点

  2. 横向:在滤波器中,取范围内中心点的值和左方的值,两者之差填入中心点

  3. 注意:有可能用较大值减去较小值。比如: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()
结果展示
原图 纵向差分 横向差分
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

为什么我感觉看着不明显,换个图试试!

原图 纵向差分 横向差分
在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

哈哈,这下结果就一目了然了。

原文地址:https://www.cnblogs.com/Jack-Tim-TYJ/p/12831914.html