固定サイズ(たとえば500 * 500)の画像がたくさんあります。固定サイズ(たとえば800 * 800)にサイズ変更するが、元の画像を中央に保持し、余分な領域を固定色(たとえば黒)で塗りつぶすPythonスクリプトを作成したいと思います。
PILを使用しています。この関数を使用して画像のサイズを変更できるresize
ようになりましたが、アスペクト比が変更されます。これを行う方法はありますか?
固定サイズ(たとえば500 * 500)の画像がたくさんあります。固定サイズ(たとえば800 * 800)にサイズ変更するが、元の画像を中央に保持し、余分な領域を固定色(たとえば黒)で塗りつぶすPythonスクリプトを作成したいと思います。
PILを使用しています。この関数を使用して画像のサイズを変更できるresize
ようになりましたが、アスペクト比が変更されます。これを行う方法はありますか?
目的の新しいサイズで新しい画像を作成し、古い画像を中央に貼り付けて保存できます。必要に応じて、元の画像を上書きできます (よろしいですか? ;o)
import Image
old_im = Image.open('someimage.jpg')
old_size = old_im.size
new_size = (800, 800)
new_im = Image.new("RGB", new_size) ## luckily, this is already black!
new_im.paste(old_im, ((new_size[0]-old_size[0])//2,
(new_size[1]-old_size[1])//2))
new_im.show()
# new_im.save('someimage.jpg')
はいあります。
次のようにします。
from PIL import Image, ImageOps
ImageOps.expand(Image.open('original-image.png'),border=300,fill='black').save('imaged-with-border.png')
同じことを数行で書くことができます:
from PIL import Image, ImageOps
img = Image.open('original-image.png')
img_with_border = ImageOps.expand(img,border=300,fill='black')
img_with_border.save('imaged-with-border.png')
そして、あなたは画像のリストを持っていると言います。次に、サイクルを使用してそれらすべてを処理する必要があります。
from PIL import Image, ImageOps
for i in list-of-images:
img = Image.open(i)
img_with_border = ImageOps.expand(img,border=300,fill='black')
img_with_border.save('bordered-%s' % i)
または、 OpenCVを使用している場合copyMakeBorder
、画像の任意の側面にパディングを追加できる関数が呼び出されます。無地の色だけでなく、画像を反射させたり拡張したりするような派手な境界線のためのいくつかのクールなオプションもあります.
import cv2
img = cv2.imread('image.jpg')
color = [101, 52, 152] # 'cause purple!
# border widths; I set them all to 150
top, bottom, left, right = [150]*4
img_with_border = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)
ソース: OpenCV 境界チュートリアルおよび copyMakeBorder の OpenCV 3.1.0 ドキュメント
PIL のメソッドは、ドキュメントcrop
には明示的に記載されていませんが、元の画像のバウンディング ボックスの外側にある数値を使用することで、実際にこれを処理できます。左と上に負の数を指定すると、それらの端に黒いピクセルが追加されます。一方、右と下に元の幅と高さより大きい数値を指定すると、それらの端に黒のピクセルが追加されます。
このコードは奇数のピクセル サイズを考慮しています。
from PIL import Image
with Image.open('/path/to/image.gif') as im:
old_size = im.size
new_size = (800, 800)
if new_size > old_size:
# Set number of pixels to expand to the left, top, right,
# and bottom, making sure to account for even or odd numbers
if old_size[0] % 2 == 0:
add_left = add_right = (new_size[0] - old_size[0]) // 2
else:
add_left = (new_size[0] - old_size[0]) // 2
add_right = ((new_size[0] - old_size[0]) // 2) + 1
if old_size[1] % 2 == 0:
add_top = add_bottom = (new_size[1] - old_size[1]) // 2
else:
add_top = (new_size[1] - old_size[1]) // 2
add_bottom = ((new_size[1] - old_size[1]) // 2) + 1
left = 0 - add_left
top = 0 - add_top
right = old_size[0] + add_right
bottom = old_size[1] + add_bottom
# By default, the added pixels are black
im = im.crop((left, top, right, bottom))
4 タプルの代わりに、2 タプルを使用して左/右と上/下に同じ数のピクセルを追加するか、1 タプルを使用してすべての側面に同じ数のピクセルを追加することができます。
ximg = Image.open(qpath)
xwid,xhgt = func_ResizeImage(ximg)
qpanel_3 = tk.Frame(Body,width=xwid+10,height=xhgt+10,bg='white',bd=5)
ximg = ximg.resize((xwid,xhgt),Image.ANTIALIAS)
ximg = ImageTk.PhotoImage(ximg)
panel = tk.Label(qpanel_3,image=ximg)
panel.image = ximg
panel.grid(row = 2)