• 挑战图像处理100问(18)——Emboss滤波器


    在这里插入图片描述

    Emboss滤波器

    Emboss滤波器可以使物体轮廓更加清晰,按照以下式子定义:
    K=[210111012] K= left[ egin{matrix} -2&-1&0\ -1&1&1\ 0&1&2 end{matrix} ight]

    代码实现
    import cv2 # 我只用它来做图像读写和绘图,没调用它的其它函数哦
    import numpy as np # 进行数值计算
    
    # padding 函数
    def padding(img, K_size=3):
    	# img 为需要处理图像
    	# K_size 为滤波器也就是卷积核的尺寸,这里我默认设为3*3,基本上都是奇数
    
    	# 获取图片尺寸
    	H, W, C = img.shape
    
    	pad = K_size // 2 # 需要在图像边缘填充的0行列数,
    	# 之所以我要这样设置,是为了处理图像边缘时,滤波器中心与边缘对齐
    
    	# 先填充行
    	rows = np.zeros((pad, W, C), dtype=np.uint8)
    	# 再填充列
    	cols = np.zeros((H+2*pad, pad, C), dtype=np.uint8)
    	# 进行拼接
    	img = np.vstack((rows, img, rows)) # 上下拼接
    	img = np.hstack((cols, img, cols)) # 左右拼接
    
    	return img
    
    # Emboss 滤波函数
    def emboss(img, K_size=3):
    
    	# 获取图像尺寸
    	H, W, C = img.shape
    
    	# 进行padding
    	pad = K_size // 2
    	out = padding(img, K_size=3)
    
    	# 纵向滤波器系数
    	K = np.array([[-2., -1., 0.],[-1., 1., 1.], [0., 1., 2.]])
    
    	# 进行滤波
    	tem = out.copy()
    
    	for h in range(H):
    		for w in range(W):
    			for c in range(C):
    
    				out[pad+h, pad+w, c] = np.sum(K * tem[h:h+K_size, w:w+K_size, c])
    				
    
    	out = np.clip(out, 0, 255)
    	
    	out = out[pad:pad+H, pad:pad+W].astype(np.uint8)
    
    
    	return out
    
    # 这里需要把图像先灰度化
    # 直接用之前的灰度化代码
    # 灰度化函数
    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 + 'imori.jpg' 
    file_out = path + 'emboss_filter_imori.jpg'
    
    img = cv2.imread(file_in)
    
    # 调用函数进行灰度化
    img = BGR2GRAY(img)
    # 调用函数进行emboss滤波
    out = emboss(img)
    
    # 保存图片
    cv2.imwrite(file_out, out)
    cv2.imshow("result", out)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    结果展示
    原图 拉普拉斯提取图像边缘
    在这里插入图片描述 在这里插入图片描述

    可以看到,Emboss滤波器能够有效地增强图像的轮廓。

  • 相关阅读:
    Redis21:客户端与服务器端的通信与redis管道
    Redis20:keys、scan、bigkeys、查看key的存储方式
    Redis19:限流
    Redis18:分布式锁
    Redis17:cluster集群
    Redis16:两种redis集群解决方案:codis和cluster
    Android : 获取声卡信息的测试代码
    Android : 基于alsa库的音乐播放
    Android system :灯光系统_HAL_lights
    Android system :led_class驱动
  • 原文地址:https://www.cnblogs.com/Jack-Tim-TYJ/p/12831909.html
Copyright © 2020-2023  润新知