2016-04-06 14 views
1

Kesilmesi gereken çok sayıda ekran görüntüsü var. Tüm görüntüler benzer görünür - içinde mavi grafikli, içinde bazı grafik öğeleri içeren dikdörtgen bir pencere vardır. Bu pencere bir diğerinin içinde yer alıyor ama sadece iç pencereyi kesmem gerekiyor. Tüm görüntülerin karşısında, iç pencerenin boyutları farklıdır ve içerik de öyle. Çoğu durumda içerik, dikdörtgen formlu ve bazen de mavi kenarlı, iç pencere ile aynı kenarlığa sahip öğeler içerir. Ben bahsediyorum çünkü şu akışı düşünüyorum:Python'da çoklu görüntülerin desen tabanlı bir alanını kırpın

Hedef dizindeki tüm resimlerden geçen bir komut dosyası. Bunların her biri için:

  • alanını bulun (iç pencere)
  • Kırpma alanı
  • kaydet dosya

Bu nasıl yapılabilir kırpılmış edilecek? Python zorunlu değildir, başka da olabilir.

+1

Sanırım öyle. Dikdörtgenlerle bu görüntülerin bazı örneklerini koyabilir misin? – armatita

+0

Hayır, kendine güvenen: \ –

cevap

0

Bu basit değil ama bu olası bir tarifi:

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

, fonksiyonların adı kendi kendini açıklayan olmalıdır. Bu alıştırmanın amacı için sentetik veriler oluşturuldu.

Picture with red rectangle

Extracting bright Red pixels

Denoising the extraction

Extracting the regular bounding box of the image

Tabii ki, bu aşamaların her biri gereksinimlerine bağlı olarak değiştirilebilir, ancak bu bir olacaktır: Sonuçlar (sırayla) vaka çalışmalarının çoğunluğu için fonksiyonel çözüm.