Python 将二维形状转换为一维空间(形状分类。)
我正在寻找一个基于以下步骤使用Python将二维形状转换为一维空间的代码/库示例:Python 将二维形状转换为一维空间(形状分类。),python,image-processing,Python,Image Processing,我正在寻找一个基于以下步骤使用Python将二维形状转换为一维空间的代码/库示例: 找到形状的质心 通过选择质心作为参考原点,逆时针展开外轮廓,将其转换为距离信号,该信号由每个边界像素和质心之间的所有距离组成(如图像) 谢谢大家! 前段时间我做了类似的事情是为了好玩,灵感来自于一场卡格尔比赛。我使用opencv查找图像的轮廓。下面是python 2.7的代码。有关返回轮廓的方向,请参见。您可能需要根据自己的需要对其进行调整,特别是阈值部分。希望这有帮助 import cv2 import nu
谢谢大家! 前段时间我做了类似的事情是为了好玩,灵感来自于一场卡格尔比赛。我使用
opencv
查找图像的轮廓。下面是python 2.7的代码。有关返回轮廓的方向,请参见。您可能需要根据自己的需要对其进行调整,特别是阈值部分。希望这有帮助
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)
不久前,我做了一些类似的事情,是为了好玩,灵感来自一场卡格尔比赛。我使用
opencv
查找图像的轮廓。下面是python 2.7的代码。有关返回轮廓的方向,请参见。您可能需要根据自己的需要对其进行调整,特别是阈值部分。希望这有帮助
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)
不知道是否有帮助,但质心可以用scipy计算:scipy还有一个模块用于计算阵列中两点之间的距离:另外请注意,OpenCV中的计数可能更适合您的需要:谢谢,Bobo。我会检查的。似乎有帮助。你想用它作为形状匹配的形状描述符吗?@dhanushka这是形状描述符,兄弟。图像a将被转换为图像b。不知道这是否有帮助,但质心可以用scipy计算:scipy还有一个模块用于计算阵列中两点之间的距离:还要注意,OpenCV中的计数可能更适合您的需要:谢谢,Bobo。我会检查的。似乎有帮助。你想用它作为形状匹配的形状描述符吗?@dhanushka这是形状描述符,兄弟。图像a将转换为图像b。谢谢。我会查的,谢谢。我会检查的。