2016-04-06 2 views
1

У меня есть большое количество скриншотов, которые нужно обрезать. Все изображения выглядят одинаково - прямоугольное окно с синей рамкой, содержащее некоторые графические элементы внутри. Это окно содержится внутри другого, но мне нужно обрезать только внутреннее окно. Во всех изображениях размеры внутреннего окна различны, а также содержание. Содержание в большинстве случаев включает элементы с прямоугольной формой, а иногда - синюю границу, ту же границу, что и внутреннее окно. Я упоминаю об этом, потому что я думаю о следующем потоке:Обрезать область с несколькими рисунками в python

Скрипт, который проходит через все изображения в целевом каталоге. Для каждого из них:

  • Найти площадь должна быть обрезана (внутреннее окно)
  • Crop область
  • Сохранить файл

Как это можно сделать? Python не является обязательным, может быть и любым другим.

+1

думаю. Можете ли вы привести здесь несколько примеров этих изображений с прямоугольниками? – armatita

+0

Нет, он уверен: \ –

ответ

0

Это не просто, но это возможно рецепт:

import matplotlib.pyplot as plt 
import numpy as np 

def synthimage(): 
    w,h = 300,200 
    im = np.random.randint(0,255,(w,h,3))/255 
    xa = np.random.randint(50,w-60) 
    xb = xa + np.random.randint(50,90) 
    ya = np.random.randint(50,h-60) 
    yb = ya + np.random.randint(20,50) 
    im[xa:xb,ya] = np.array([1,0,0]) 
    im[xa:xb,yb] = np.array([1,0,0]) 
    im[xa,ya:yb] = np.array([1,0,0]) 
    im[xb,ya:yb] = np.array([1,0,0]) 
    return im 

def getRectPoints(im): 
    x,y = [],[] 
    for i in range(im.shape[0]): 
     for j in range(im.shape[1]): 
      if (im[i,j]-np.array([1,0,0])).sum()==0: 
       x.append(i) 
       y.append(j) 
    return np.array(x),np.array(y) 

def denoise(x,y): 
    nx,ny = [],[] 
    for i in range(x.shape[0]): 
     d = np.sqrt((x[i]-x)**2+(y[i]-y)**2) 
     m = d<2 
     if len(m.nonzero()[0])>2: 
      nx.append(x[i]) 
      ny.append(y[i]) 
    return np.array(nx),np.array(ny) 

im = synthimage()  
plt.imshow(np.swapaxes(im,0,1),origin='lower',interpolation='nearest') 
plt.show() 

x,y = getRectPoints(im) 
plt.scatter(x,y,c='red') 
plt.xlim(0,300) 
plt.ylim(0,200) 
plt.show() 

nx,ny = denoise(x,y) 
plt.scatter(nx,ny,c='red') 
plt.xlim(0,300) 
plt.ylim(0,200) 
plt.show() 

#Assuming rectangle has no rotation (otherwise check Scipy ConveHull) 
xmi = nx.min() 
xma = nx.max() 
ymi = ny.min() 
yma = ny.max() 

new = np.ones(im.shape) 
new[xmi:xma,ymi:yma] = im[xmi:xma,ymi:yma] 
plt.imshow(np.swapaxes(new,0,1),origin='lower',interpolation='nearest') 
plt.show() 

, имя функции должно быть само-объяснения. Синтетические данные были сгенерированы для целей этого упражнения. Результаты (в порядке убывания):

Picture with red rectangle

Extracting bright Red pixels

Denoising the extraction

Extracting the regular bounding box of the image

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

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