我必须使用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:我有原始图像和裁剪的坐标
我更新了代码
记住作物坐标可能是负面的。
输入&输出示例
输入img:http://i.imgur.com/vbmPy.jpg
box2=(-743, 803, 1646, 4307)
答案 0 :(得分: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,但它可能有一些像素访问功能。
答案 1 :(得分: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')
答案 2 :(得分:0)
完全按照您的要求进行操作,将图像转换为numpy数组并过滤完整的黑色行和列(在第二个图像上)。您不能简单地将所有黑色像素设为白色,因为这会影响图像内部的那些像素。
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()
看起来黑色和图像之间有一些平滑,需要更高级的滤镜来解决这个问题 - 但是你可以看到如何从这里开始!
答案 3 :(得分: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')