从轮廓中提取图像

时间:2013-12-01 08:29:27

标签: python image python-2.7 scipy

我正在试图弄清楚如何制作一个从一张图片中剪切图像的脚本。在得到图像的轮廓后,我无法理解该怎么做。我的想法是加载一张纸,将其转换为灰度,找到轮廓,使用它们从原始彩色图像中剪切出来并单独保存。

import numpy as np
from sys import argv
from PIL import Image
from skimage import measure

# Inicialization
spritesToFind = argv[1]
spriteSize = argv[2]
sheet = Image.open(argv[3])

# To grayscale, so contour finding is easy
grayscale = sheet.convert('L')

# Let numpy do the heavy lifting for converting pixels to black or white
data = np.asarray(grayscale).copy()

# Find the contours we need
contours = measure.find_contours(data, 0.8)

# Now we put it back in PIL land

sprite = Image.fromarray(data)
sprite.save(str(spritesToFind), "PNG")

2 个答案:

答案 0 :(得分:0)

如果您只想剪切包含轮廓的最小矩形,可以使用轮廓中的(x,y)坐标创建从(min(x),min(y))到(max)的边界框(x)的最大值(Y))。

如果你想把所有不在轮廓内的东西归零,你应该研究如何确定一个点是否在一个多边形内,然后将每个不在轮廓内的点都归零。

答案 1 :(得分:0)

其中contours是使用measure.find_contours找到的计数列表,x是您的图像。这显示了如何同时执行矩形边界框提取image_patch以及如何提取 作为多边形new_image的一部分的像素:

from matplotlib import path

contour = contours[0]
path = path.Path(contour)

top = min(contour[:,0])
bottom = max(contour[:,0])
left = min(contour[:,1])
right = max(contour[:,1])

new_image = np.zeros([bottom-top,right-left])

for xr in range(new_image.shape[0]):
    for yr in range(new_image.shape[1]):        
        if(path.contains_point([top+xr,left+yr])):
            new_image[xr, yr] = x[top+xr, left+yr]


image_patch = x[top:bottom,left:right]

plt.imshow(image_patch)
plt.show()

plt.imshow(new_image)
plt.show()