zoukankan      html  css  js  c++  java
  • 手动实现Gabor滤波器

    Gabor 函数表示

    复数表示:

    复数表示

    实数部分:

    实数部分

    虚数部分:

    虚数部分

    其中:

    Gabor函数 x' 、y' 计算公式

    代码中参数和Gabor函数参数对应关系

    代码实现了Gabor滤波器的实数部分。代码中参数和Gabor函数实数部分参数对应如下:
    python实现Gabor的核心代码

    对应

    Gabor实数部分

    看上去是不是感觉很容易实现Gabor滤波器,那我来实现一下,并使用Gabor滤波器来提取图像特征。

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Grayscale
    def BGR2GRAY(img):
    	# Grayscale
    	gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]
    	return gray
    
    # Gabor Filter
    def Gabor_filter(K_size=111, Sigma=10, Gamma=1.2, Lambda=10, Psi=0, angle=0):
    	# get half size
    	d = K_size // 2
    
    	# prepare kernel
    	gabor = np.zeros((K_size, K_size), dtype=np.float32)
    
    	# each value
    	for y in range(K_size):
    		for x in range(K_size):
    			# distance from center
    			px = x - d
    			py = y - d
    
    			# degree -> radian
    			theta = angle / 180. * np.pi
    
    			# get kernel x
    			_x = np.cos(theta) * px + np.sin(theta) * py
    
    			# get kernel y
    			_y = -np.sin(theta) * px + np.cos(theta) * py
    
    			# fill kernel
    			gabor[y, x] = np.exp(-(_x**2 + Gamma**2 * _y**2) / (2 * Sigma**2)) * np.cos(2*np.pi*_x/Lambda + Psi)
    
    	# kernel normalization
    	gabor /= np.sum(np.abs(gabor))
    
    	return gabor
    
    
    # 使用Gabor滤波器作用于图像上
    def Gabor_filtering(gray, K_size=111, Sigma=10, Gamma=1.2, Lambda=10, Psi=0, angle=0):
        # get shape
        H, W = gray.shape
    
        # padding
        gray = np.pad(gray, (K_size//2, K_size//2), 'edge')
    
        # prepare out image
        out = np.zeros((H, W), dtype=np.float32)
    
        # get gabor filter
        gabor = Gabor_filter(K_size=K_size, Sigma=Sigma, Gamma=Gamma, Lambda=Lambda, Psi=0, angle=angle)
            
        # filtering
        for y in range(H):
            for x in range(W):
                out[y, x] = np.sum(gray[y : y + K_size, x : x + K_size] * gabor)
    
        out = np.clip(out, 0, 255)
        out = out.astype(np.uint8)
    
        return out
    
    
    # 使用6个不同角度的Gabor滤波器对图像进行特征提取
    def Gabor_process(img):
        # get shape
        H, W, _ = img.shape
    
        # gray scale
        gray = BGR2GRAY(img).astype(np.float32)
    
        # define angle
        #As = [0, 45, 90, 135]
        As = [0,30,60,90,120,150]
    
        # prepare pyplot
        plt.subplots_adjust(left=0, right=1, top=1, bottom=0, hspace=0, wspace=0.2)
    
        out = np.zeros([H, W], dtype=np.float32)
    
        # each angle
        for i, A in enumerate(As):
            # gabor filtering
            _out = Gabor_filtering(gray, K_size=11, Sigma=1.5, Gamma=1.2, Lambda=3, angle=A)
    
            # add gabor filtered image
            out += _out
    
        # scale normalization
        out = out / out.max() * 255
        out = out.astype(np.uint8)
    
        return out
    
    
    # Read image
    img = cv2.imread("../paojie.jpg").astype(np.float32)
    
    # gabor process
    out = Gabor_process(img)
    
    cv2.imwrite("out.jpg", out)
    cv2.imshow("result", out)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    实验结果:

    原图
    Gabor滤波器特征提取结果

    实验中,我使用了6个不同角度的Gabor滤波器对图像进行了滤波,并将滤波结果相加得到了最终的图像特征图。可以观察到,结果特征图其实就是原图像的纹理表示。

    点个赞再走呗

  • 相关阅读:
    android获取sd卡路径方法
    Log4Net的使用
    asp.net网站发布
    用网站(WebSite而不是WebProject)项目构建ASP.NET MVC网站
    Asp.Net MVC 路由
    面试题:两个栈模拟队列&&两个队列模拟栈
    TextBlob Quick Start
    链表基本操作题
    leetcode341 扁平化嵌套数组
    细说浏览器输入URL后发生了什么
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12568688.html
Copyright © 2011-2022 走看看