机器学习图像特征提取

3

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

我有一张由彩色图像转换而来的灰度图像。

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)

上述代码的输出结果只是True。

有没有什么解决方案或想法,我该怎么做?

1个回答

0

你代码中的描述符des0

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

这是你需要在机器学习算法中使用的功能。

下面是一个例子,使用 ML 的 knn 算法在立体图像对上进行基于 Dense SIFT 的匹配:

输入图像: enter image description here

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

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)

编写用于密集SIFT的函数。
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

创建一个空的模板图像,其尺寸与可视化SIFT匹配的图像类似。
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()

enter image description here


你可以直接将 des0 作为输入传递给你的机器学习模型。上面的例子只是说明了它的使用方法。 - Abhi25t
我一步一步地完成了这些操作。首先,我使用convert(“LA”)将图像转换为灰度图像,矩阵形状为(422,750)。然后,我使用ORB函数处理这个灰度图像,输出的des0形状为(500,32)。 - noobinmath
之后,我想用它来训练我的模型。这是我的模型的输入,输出是我的图像的彩色版本。 - noobinmath
彩色图像的形状为(422,750,3)。在训练之前,我尝试对这些数据进行训练测试拆分,但我也不确定这种方式是否正确。 - noobinmath
有人说矩阵的前两个值应该相同,第三个值是不必要的。 - noobinmath
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接