7

一些视频的帧具有像边框一样的黑色条带。我必须将它们从框架中移除。我想出了一个粗略的解决方案:

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,也不会删除整个黑色条带。

这是原始图像: 在此处输入图像描述

这是运行程序后的图像: 在此处输入图像描述

任何人都可以提出更好地解决这个问题的建议吗?谢谢!

4

4 回答 4

20

这个问题已经在这个答案中解决了。

from PIL import Image, ImageChops

im = Image.open('iI3ZE.jpg')

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)


trim(im).show()

我用枕头代替 PIL:

pip install pillow

结果是:

在此处输入图像描述

于 2013-10-09T12:22:46.573 回答
1

在您的尝试中使用 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 
于 2013-10-09T12:27:19.827 回答
1

我认为如果您从图像的另一侧工作,您会发现问题消失了,因为您正在检查第一列 (col[0] - 它是黑色的,因此您将其删除,黑色 col[1] 变为 col [0] 然后你检查 col[1] - 跳过新的 col[0]....

如果你从最大值开始,它会起作用,或者一旦你删除它,你就留在任何给定的 col 上。或者,您可以列出要删除的列表,将其反转,然后进行删除。

于 2013-10-09T12:20:41.787 回答
0

为什么不计算框架并使用 PIL

from PIL import Image

img = Image.open('myImage.jpeg')
box = (50, 50, 100, 100)
area = img.crop(box)
于 2013-10-09T12:19:23.753 回答