2013-10-09 29 views
3

某些視頻的框架具有黑色邊框,如邊框。我必須從框架中刪除它們。我想出了一個粗液:從Python中的圖像中刪除邊框

import sys, cv2, numpy 
import Image, scipy 

filename = "snap.jpeg" 

img = cv2.imread(filename) 

def checkEqual(lst): 
    return len(set(lst)) <= 1 ## <-- This is the maximum length of the set 

def removeColumns(image): 
    for col in range(image.shape[1]): 
     for ch in range(3): 
      try: 
       checkEqual(image[:, col, ch].tolist()) 
      except IndexError: 
       continue 
      else: 
       if checkEqual(image[:, col, ch].tolist()): 
        try: 
         image = numpy.delete(image, col, 1) 
        except IndexError: 
         continue 
        else: 
         pass 
    return image 

img2 = removeColumns(img) 

print img.shape, img2.shape ## (480, 856, 3) (480, 705, 3) 

在這裏,我發現有相同的元素和所有我有黑色邊框的影片列。但即使我將函數checkEqual()中的最大長度從1增加到20或40,整個黑色條紋也不會被刪除。

這是原始圖像: enter image description here

這是運行該程序後的圖像: enter image description here

誰能給建議了一個更好的辦法解決這個問題? 謝謝!

回答

6

此問題已在this answer中解決。

In [1]: from PIL import Image, ImageChops 

In [3]: im = Image.open('iI3ZE.jpg') 

In [4]: def trim(im): 
    ...:   bg = Image.new(im.mode, im.size, im.getpixel((0,0))) 
    ...:   diff = ImageChops.difference(im, bg) 
    ...:   diff = ImageChops.add(diff, diff, 2.0, -100) 
    ...:   bbox = diff.getbbox() 
    ...:   if bbox: 
    ...:     return im.crop(bbox) 
    ...: 

In [5]: trim(im).show() 

我用枕頭代替PIL:

pip install pillow 

結果:

enter image description here

0

爲什麼不計算幀,並使用PIL

from PIL import Image 

img = Image.open('myImage.jpeg') 
box = (50, 50, 100, 100) 
area = img.crop(box) 
+0

T母雞是什麼?保存在哪裏? –

0

我認爲你會發現,問題消失,如果你從圖像的另一側工作,因爲你正在檢查的第一列(COL [0] - 它是黑色的,所以你刪除它,黑色col [1]變成col [0],然後你檢查col [1] - 跳過新的col [0] ....

如果你從它可以工作的最大值,或者如果你刪除了任何給定的col,你也可以創建一個清單,刪除它,然後刪除。

0

使用OpenCV的和numpy的在你嘗試怎麼是這樣的:

im = cv2.imread(filename) 
h,w,d = im.shape 
#left limit 
for i in range(w): 
    if np.sum(im[:,i,:]) > 0: 
     break 
#right limit 
for j in xrange(w-1,0,-1): 
    if np.sum(im[:,j,:]) > 0: 
     break 

cropped = im[:,i:j+1,:].copy() # deep copy to get byte-aligned array needed for opencv