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

1

最初の列を確認しているので、画像の反対側から作業すると問題が解決することがわかると思います(col [0]-黒なので削除すると、黒のcol [1]がcolになります[0] 次に、col[1] をチェックします - 新しい col[0] をスキップします....

最大から開始する場合は機能するか、削除した後に特定の列にとどまる場合。または、削除するリストを作成し、逆にしてから削除することもできます。

于 2013-10-09T12:20:41.787 に答える
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 に答える
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 に答える