2

PILを使用してpythonで写真をトリミングする必要があります。
写真領域が十分でない場合、残りの領域は黒で表示されます。
その領域を白くするにはどうすればよいですか?

これは私が今使っているコードの一部です:

i = Image.open(filepath)
box2 = (newX,newY,newX+newW,newY+newH)
i2=i.crop(box=box2)
i2.load()
...
i2.save(new_filepath)
...
white=(255,255,255)
i3 = Image.new( 'RGB' , i2.size , white )
i3.paste( i2)
i3.save(filepath2,'PNG')

トリミングはうまくいきますが、残りの領域では黒ではなく白が必要です。背景が白の画像を新規作成し、トリミングした画像を貼り付けてみましたが、うまくいきません。

編集: 出力例

出力例

EDIT2:元の画像とトリミングの座標があります。
コードを更新しました
。トリミングの座標 が負になる可能性があることを思い出してください。

入出力例
input img: http://i.imgur.com/vbmPy.jpg

box2=(-743, 803, 1646, 4307)  

出力画像: http://i.imgur.com/K7sil.jpg

4

4 に答える 4

1

numpy を使用できる場合は、次のようなことができます。

i22 = flipud(asarray(i2).copy())
# calculate the area that its black, using the original size and the box information
for i in xrange(blackrows):
  i22[i:] = asarray([255,255,255])
# and and something like that to the blackcolumns

私は PIL をあまり使用しませんが、おそらくいくつかのピクセル アクセス機能があります。

于 2012-08-29T13:02:47.827 に答える
1

あなたは何か間違ったことをしているように見えます.コード全体と画像を共有する必要があります.

私はこれを PIL で何度も行ってきましたが、最も簡単な解決策は常に、クロップを真っ白な画像に貼り付けることです。

import Image

# open source
i = Image.open('hHncu.png')

# crop it
( newX , newY ) = ( 110 , 0 )
( newW , newH ) = ( 110 , 150 )
box_crop = ( newX,newY,newX+newW,newY+newH )
i2 = i.crop(box=box_crop)
i2.load()

# save it , just for testing
i2.save('hHncu-out.png')

# create the new image, and paste it in
# note that we're making it 300x300  and have the background set to white (255x3)
i3 = Image.new( 'RGB' , (300,300) , (255,255,255) )
# paste it at an offset. if you put no offset or a box, i3 must match i2s dimensions
i3.paste( i2 , (25,25) )
# save it
i3.save('hHncu-out-2.png')
于 2012-08-29T15:15:31.333 に答える
0

わかった。ここで、私が言及したアイデアを簡単に突き刺します。

rebox() 関数は、オフセット データとともに「固定された」バウンディング ボックスを返します。

これはほとんどの状況で機能します。私はオフセットデータを統合しませんでしたが、そのいくつかのバージョンはおそらくセクションに入るでしょうi3.paste.

テスト画像 grid.png は 300x300 で、50px に青い線、150px に赤い線、200px に緑の線があります。

これを正確なニーズに合わせて調整できるはずです。

ここに画像の説明を入力

import Image
i1 = Image.open('grid.png')


DEBUG = True

def rebox( box_original , box_crop_desired ):

    box_crop_new= list( box_crop_desired )
    box_crop_offset = [ 0 , 0 ]

    if box_crop_desired[0] < 0:
        box_crop_new[0] = 0
        box_crop_offset[0] = box_crop_desired[0]

    if box_crop_desired[1] < 0:
        box_crop_new[1] = 0
        box_crop_offset[1] = box_crop_desired[1]

    if box_crop_desired[2] > box_original[2]:
        box_crop_new[2] = box_original[2]

    if box_crop_desired[3] > box_original[3]:
        box_crop_new[3] = box_original[3]

    box_crop_offset = tuple(box_crop_offset)
    box_crop_new = tuple(box_crop_new)

    if DEBUG :
        print "box_original                      %s" % str(box_original)
        print "box_crop_offset                   %s" % str(box_crop_offset)
        print "box_crop_desired                  %s" % str(box_crop_desired)
        print "box_crop_new                      %s" % str(box_crop_new)

    return ( box_crop_new , box_crop_offset )


( newX , newY ) = ( 200 , 200 )
( newW , newH ) = ( 400 , 400 )
box_crop_desired = ( newX , newY , newX+newW, newY+newH )
( box_crop , box_crop_offset ) = rebox( i1.getbbox() , box_crop_desired )

i2 = i1.crop(box=box_crop)
i2.save('grid-out-b.png')

i3 = Image.new( 'RGBA' , ( newW , newH ) , (255,255,255) )
i3.paste( i2 , (0,0) )
i3.save('grid-out-final-b.png')
于 2012-08-30T00:11:18.303 に答える
0

あなたが要求したとおりに行うには、画像をnumpy配列に変換し、完全な黒の行と列をフィルタリングします(2番目の画像で)。すべての黒いピクセルを単純に白くすることはできません。これは、画像の内側にあるピクセルに影響を与えるためです。

import numpy
from PIL import Image
img = Image.open("hHncu.png") # Imgur's naming scheme
pix = numpy.array(img)        # Convert to array

black = numpy.array([0,0,0,255])
white = numpy.array([255,255,255,255])

pix2 = pix.copy()
dim  = pix.shape

for n in xrange(dim[0]):
    if (pix[n,:]==black).all(): 
        pix2[n,:,numpy.newaxis] = white

for n in xrange(dim[1]):
    if (pix[:,n]==black).all(): 
        pix2[:,n,numpy.newaxis] = white

# View the results
from pylab import *
subplot(121); imshow(pix )
subplot(122); imshow(pix2)
show()

ここに画像の説明を入力

黒と画像の間にいくらかスムージングがあるように見えます。これを修正するには、より高度なフィルターが必要です。しかし、ここから開始する方法を見ることができます!

于 2012-08-29T13:48:55.600 に答える