将2D形状转换为1D空间(形状分类。)

时间:2017-12-04 09:43:58

标签: python image-processing

我正在寻找一个代码/库的示例,使用Python将2D形状转换为1D空间,具体步骤如下:

  1. 找出形状的质心。
  2. 通过选择质心作为参考原点,逆时针展开外部轮廓,将其转换为由每个边界像素和质心之间的所有距离组成的距离信号(如图像)
  3. Convert 2d shape to 1d space

    谢谢!

1 个答案:

答案 0 :(得分:2)

leaf classification的Kaggle比赛的启发下,我有一段时间做了类似的事情。我使用opencv来查找图像的轮廓。下面是python 2.7的代码。有关返回轮廓的方向,请参阅here。您可能必须根据您的需要进行调整,特别是阈值部分。希望这会有所帮助。

import cv2
import numpy as np
import matplotlib.pyplot as plt


def shape_desc(im):
    # threshold image
    _, bw = cv2.threshold(im, 128, 255, cv2.THRESH_BINARY)
    # find contours
    contours, hierarchy = cv2.findContours(im.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    # extract largest contour
    largest_idx = np.argmax([len(contours[i]) for i in range(0, len(contours))])
    # get (x,y) coordinates
    x = np.array([contours[largest_idx][i][0][0] for i in range(0, len(contours[largest_idx]))], dtype = np.float).reshape((len(contours[largest_idx]), 1))
    y = np.array([contours[largest_idx][i][0][1] for i in range(0, len(contours[largest_idx]))], dtype = np.float).reshape((len(contours[largest_idx]), 1))
    # find the centroid
    m = cv2.moments(np.array([[x[i][0], y[i][0]] for i in range(0, len(x))]).reshape((-1, 1 ,2)).astype(np.int32))
    x_bar = m['m10']/m['m00']
    y_bar = m['m01']/m['m00']

    x_1 = np.array([i[0] for i in x])
    y_1 = np.array([i[0] for i in y])
    # take the centroid as the reference
    x = x_1 - x_bar
    y = y_1 - y_bar

    return np.sqrt(x*x + y*y)

以下是将其应用于以下形状相似的图像的结果。请注意,图像和绘图已重新调整。

filename = '19.jpg'
im = cv2.imread(filename, 0)

desc = shape_desc(im)
plt.stem(desc)

16 19 plot16 plot19