【问题标题】:Machine learning image feature extraction机器学习图像特征提取
【发布时间】:2021-05-12 12:34:13
【问题描述】:

在机器学习中从灰度图像中提取特征存在问题。

我有一张用这个颜色转换成的灰色图像。

from PIL import Image
img = Image.open('source.png').convert('LA')
img.save('greyscalesource.png')

image2 = imread('greyscalesource.png')
print("The type of this input is {}".format(type(image)))
print("Shape: {}".format(image2.shape))
plt.imshow(image2)

输出是:

我实际上需要从这张灰色图片中提取特征,因为下一部分是关于训练具有此特征的模型以预测图像的彩色形式。

我们不能使用任何深度学习库

有一些方法,例如 SIFT ORB FAST... 但我真的不知道如何为我的目标提取特征。

#ORB
orb = cv2.ORB_create()
#keypoints and descriptors
kpO, desO = orb.detectAndCompute(img, None)
img7 = cv2.drawKeypoints(img, kpO, 1, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite('_ORB.jpg',img7)

以上代码的输出为真。

有什么解决方案或想法我该怎么办?

【问题讨论】:

    标签: machine-learning image-processing feature-extraction


    【解决方案1】:

    你的行中的描述符des0

    kpO, desO = orb.detectAndCompute(img, None)
    

    是您需要用于 ML 算法的功能。

    以下是使用 ML 的 knn 算法对立体图像对进行基于 Dense SIFT 的匹配的示例:

    输入图像:

    读取输入图像并分割立体图像

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    def split_input_image(im):
        im1 = im[:,:int(im.shape[1]/2)]
        im2 = im[:,int(im.shape[1]/2):im.shape[1]]
        # Convert to grayscale
        g_im1 = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
        g_im2 = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
        return im1, im2, g_im1, g_im2
    
    im = cv2.imread('../input_data/Stereo_Pair.jpg')
    im1, im2, g_im1, g_im2 = split_input_image(im)
    

    为密集筛选编写函数

    def dense_sift(gray_im):
        sift = cv2.xfeatures2d.SIFT_create()
        step_size = 5
        kp = [cv2.KeyPoint(x,y,step_size) for y in range(0,gray_im.shape[0],step_size)
                                          for x in range(0,gray_im.shape[1],step_size)]
        k,feat = sift.compute(gray_im,kp) # keypoints and features
        return feat, kp
    

    创建一个相似尺寸的空模板图像以可视化筛选匹配

    visualize_sift_matches = np.zeros([im1.shape[0],im1.shape[1]])
    

    获取灰度图像的特征和关键点(我的顺序是颠倒的。不要混淆。)

    f1, kp1 = dense_sift(g_im1)
    f2, kp2 = dense_sift(g_im2)
    

    使用 kNN 从两个特征集中获取匹配项

    bf = cv2.BFMatcher()
    matches = bf.knnMatch(f1,f2,k=2)
    

    查找最小阈值的常见匹配项

    common_matches = []
    for m,n in matches:
        if m.distance < 0.8 * n.distance:
            common_matches.append([m])
    

    并列两个图像并连接关键点

    visualize_sift_matches = cv2.drawMatchesKnn(im1, kp1, im2, kp2, common_matches,
    visualize_sift_matches, flags=2)
    

    可视化

    plt.imshow(visualize_sift_matches)
    plt.show()
    

    【讨论】:

    • 我需要使用这些特征作为输入,并使用彩色(有点相似)图像作为输出来训练机器学习模型。
    • 所以这不是我想要做的。我必须使用转换为灰色的照片的特征才能创建彩色照片。我必须将这些特征作为模型的输入。
    • 您可以直接使用 des0 作为 ML 模型的输入。上面的例子只是说明它是如何使用的。
    • 我一步一步地做了这些,首先我转换的灰度图像与转换(“LA”)矩阵形状为(422,750)在使用此灰度图像与ORB函数后,输出des0形状为(500,32 )。
    • 之后,我想用这个来训练我的模型。这是我的模型的输入,输出是我的图像的彩色版本。
    猜你喜欢
    • 2016-09-11
    • 2020-07-23
    • 2020-06-22
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2019-05-30
    相关资源
    最近更新 更多