2014-02-05 3 views
5

Использование numpy или scipy (я не использую OpenCV) Я пытаюсь обрезать область из изображения.Обрезать частичное изображение с помощью NumPy (или SciPy)

Например, у меня есть это:

enter image description here

, и я хочу, чтобы получить это:

enter image description here

Есть ли что-то вроде cropPolygon(image, vertices=[(1,2),(3,4)...]) с numpy или SciPy?

+0

Любые идеи, кто? –

+0

Это только для целей построения? или вы хотите фактически обрабатывать только часть ваших данных, что является интересной частью изображения? – usethedeathstar

+0

Я только хочу обработать эту область изображения –

ответ

8

Вы используете matplotlib?

Один из подходов, который я использовал ранее, заключается в использовании метода .contains_points() для построения булевой маски, которая затем может использоваться для индексации в массив изображений.

Например:

import numpy as np 
from matplotlib.path import Path 
from scipy.misc import lena 

img = lena() 

# vertices of the cropping polygon 
xc = np.array([219.5, 284.8, 340.8, 363.5, 342.2, 308.8, 236.8, 214.2]) 
yc = np.array([284.8, 220.8, 203.5, 252.8, 328.8, 386.2, 382.2, 328.8]) 
xycrop = np.vstack((xc, yc)).T 

# xy coordinates for each pixel in the image 
nr, nc = img.shape 
ygrid, xgrid = np.mgrid[:nr, :nc] 
xypix = np.vstack((xgrid.ravel(), ygrid.ravel())).T 

# construct a Path from the vertices 
pth = Path(xycrop, closed=False) 

# test which pixels fall within the path 
mask = pth.contains_points(xypix) 

# reshape to the same size as the image 
mask = mask.reshape(img.shape) 

# create a masked array 
masked = np.ma.masked_array(img, ~mask) 

# if you want to get rid of the blank space above and below the cropped 
# region, use the min and max x, y values of the cropping polygon: 

xmin, xmax = int(xc.min()), int(np.ceil(xc.max())) 
ymin, ymax = int(yc.min()), int(np.ceil(yc.max())) 
trimmed = masked[ymin:ymax, xmin:xmax] 

Черчение:

from matplotlib import pyplot as plt 

fig, ax = plt.subplots(2, 2) 

ax[0,0].imshow(img, cmap=plt.cm.gray) 
ax[0,0].set_title('original') 
ax[0,1].imshow(mask, cmap=plt.cm.gray) 
ax[0,1].set_title('mask') 
ax[1,0].imshow(masked, cmap=plt.cm.gray) 
ax[1,0].set_title('masked original') 
ax[1,1].imshow(trimmed, cmap=plt.cm.gray) 
ax[1,1].set_title('trimmed original') 

plt.show() 

enter image description here

+0

Имеет ли этот метод данные о оригинальное изображение? Странно, потому что, когда я выполняю анализ «scikit-image» на изображении, области, которые я собрал, все еще анализируются. –

+1

'masked' является [' np.ma.masked_array'] (http://docs.scipy.org/doc/numpy/reference/maskedarray.html). Независимо от того, будут ли анализироваться маскируемые области, будет зависеть от поведения конкретной функции. Большинство основных операций numpy ('np.sum',' np.max' и т. Д.) Игнорируют маскированные значения. Вы можете использовать булевскую маску многими другими способами - например, вы можете получить 1D-массив, содержащий только значения пикселей в обрезанной области, используя 'img [mask]', или вы можете установить значения за пределами этого региона в NaN, используя 'img [ ~ mask] = np.nan'. –

+0

Хм есть способ конвертировать массив масок в обычный массив? –

Смежные вопросы