zoukankan      html  css  js  c++  java
  • 挑战图像处理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()
    
    结果展示
    原图 纵向差分 横向差分
    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

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

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

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

  • 相关阅读:
    【python-opencv】opencv基础操作之一
    【胎教】做AI的基础,开始学习。
    【实习】博士生找实习的囧事之其一
    【经验】CS
    【keras】用tensorboard监视CNN每一层的输出
    【算法】背包九讲
    【计算机网络】大数据 云计算 人工智能
    【算法】shortest distance
    【git】git hello world
    【算法】深度优先 马走日 Hamilton routes
  • 原文地址:https://www.cnblogs.com/Jack-Tim-TYJ/p/12831914.html
Copyright © 2011-2022 走看看