【问题标题】:How to use Gabor filters for feature extraction from image?如何使用 Gabor 滤波器从图像中提取特征?
【发布时间】:2018-12-19 01:12:28
【问题描述】:

我想应用 Gabor 过滤器从图像中提取特征,然后在经过训练的数据上应用 NN 或 SVM。虽然我没有应用批处理,但它会完成,或者如果你可以帮助我进行机器学习部分对我来说会很棒。谢谢。 这是我的代码:

import cv2
import numpy as np
import glob

img=glob.glob("C://Users//USER//Pictures//Saved Pictures//tuhin.jpg")

img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  
ret, labels = cv2.connectedComponents(img)
label_hue = np.uint8(179*labels/np.max(labels))
blank_ch = 255*np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)
labeled_img[label_hue==0] = 0
cv2.imshow('labeled.png', labeled_img)
cv2.waitKey()

def build_filters():
filters = []
ksize = 31
for theta in np.arange(0, np.pi, np.pi / 16):
    kern = cv2.getGaborKernel((ksize, ksize), 4.0, theta, 10.0, 0.5, 0, 
              ktype=cv2.CV_32F)
    kern /= 1.5*kern.sum()
    filters.append(kern)
    return filters

def process(img, filters):
    accum = np.zeros_like(img)
    for kern in filters:
        fimg = cv2.filter2D(img, cv2.CV_8UC3, kern)
        np.maximum(accum, fimg, accum)
        return accum

filters=build_filters()
res1=process(img,filters)
cv2.imshow('result',res1)
cv2.waitKey(0)
cv2.destroyAllWindows() 

【问题讨论】:

    标签: python image image-processing svm gabor-filter


    【解决方案1】:

    我可以通过改变theta,lamda等参数来定义更多的内核,即频率和方向。我可以生成Gabor滤波器组,然后我将应用各种机器学习算法进行分类。

    批处理后的代码:

    import cv2
    import os
    import glob
    import numpy as np
    
    
    img_dir = "C://Users//USER//Pictures//Saved Pictures" 
    data_path = os.path.join(img_dir,'*g')
    files = glob.glob(data_path)
    data = []
    for f1 in files:
        img = cv2.imread(f1,0)
        data.append(img)
        img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  
        ret, labels = cv2.connectedComponents(img)
        label_hue = np.uint8(179*labels/np.max(labels))
        blank_ch = 255*np.ones_like(label_hue)
        labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])
        labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)
        labeled_img[label_hue==0] = 0
        cv2.imshow('labeled.png', labeled_img)
        cv2.waitKey()
    
        def build_filters():
            filters = []
            ksize = 31
            for theta in np.arange(0, np.pi, np.pi / 16):
                kern = cv2.getGaborKernel((ksize, ksize), 4.0, theta, 10.0, 0.5, 0, ktype=cv2.CV_32F)
                kern /= 1.5*kern.sum()
                filters.append(kern)
                return filters
    
        def process(img, filters):
            accum = np.zeros_like(img)
            for kern in filters:
                fimg = cv2.filter2D(img, cv2.CV_8UC3, kern)
                np.maximum(accum, fimg, accum)
                return accum
    
        filters=build_filters()
        res1=process(img,filters)
        cv2.imshow('result',res1)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
        cv2.imwrite("checking.tif",res1)
    

    【讨论】:

      【解决方案2】:

      这是一个很好的关于使用 scikit-image 的 gabor 滤波器提取纹理的教程:http://scikit-image.org/docs/0.11.x/auto_examples/plot_gabor.html。你可能想看看它。

      您可能希望使用深度学习/迁移学习(取决于您拥有多少数据)来自动提取特征,而不是手动提取特征。

      【讨论】:

      • 您是说我不必编辑此代码,我只需将此代码应用于大量图像以获得更多数据,然后应用机器学习算法。
      • @Akash 是的,您需要更改图像文件名:)。
      • 如果我使用 *.jpg 然后应用 for 循环并以正确的标识编写整个代码,是否方便?
      • 我现在使用了批处理,我想将它保存在一个特定的文件夹中,我该怎么做?
      • 使用 skimage.io.imsave(pathtoimage)
      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多