Python 从等高线中提取图像

Python 从等高线中提取图像,python,image,python-2.7,scipy,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

我试图找出如何制作一个脚本,从一张图片中剪切出图片。我不知道在我得到图像的轮廓后该怎么办。我的思路是加载一张纸,将其转换为灰度,找到轮廓,用它们从原始彩色图像中剪切出图像,并单独保存

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")

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


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

其中
轮廓
是使用
度量方法找到的计数列表。查找轮廓
,而
x
是你的图像。这显示了如何提取矩形边界框
图像\u面片
,以及如何仅提取作为多边形一部分的像素
新图像

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()

我想剪下包含轮廓的最小矩形,有很多轮廓。恐怕我不明白这些东西到底是怎么工作的。你能给我解释一下吗?答案取决于这张图片的样子。您可能可以使用find_等高线,但可能需要更复杂的东西。