7

PILに画像があるとしましょう

from PIL import Image
Image.open(path_to_my_image)

xとポイントとyポイントの2つのリスト

x = ['10', '30', '70']
y = ['15', '45', '90']

この画像にポリゴンを透明度でオーバーレイする方法はありますか?

また、PILはこのための優れたライブラリですか?または、別のものを使用する必要がありますか?(たとえばscikits.image、またはpylabを使用して画像にレンダリングします)。

4

2 に答える 2

9

PILは、このための優れたツールです。

import Image
import ImageDraw
img = Image.open(...).convert('RGBA')

x = ['10', '30', '70']
y = ['15', '45', '90']

# convert values to ints
x = map(int, x)
y = map(int, y)

img2 = img.copy()
draw = ImageDraw.Draw(img2)
draw.polygon(zip(x,y), fill = "wheat")

img3 = Image.blend(img, img2, 0.5)
img3.save('/tmp/out.png')

の呼び出し署名draw.polygonは次のとおりです。

def polygon(self, xy, fill=None, outline=None):

したがって、オプションはfillとだけoutlineです。私はこの情報を見つけるためにソースコードを調べました。

IPythonは私に言った:

In [38]: draw.polygon?
...
File:       /usr/lib/python2.7/dist-packages/PIL/ImageDraw.py

それは私にどこを見るべきかを示しました。


の上に半透明のポリゴンを描画するimgには、画像のコピーを作成します。コピーの1つで、アルファなしのフルカラーでポリゴンを描画します。次に、Image.blendを使用して、元の画像と設定されたレベルのコピーを組み合わせますalpha。各ピクセルについて:

out = image1 * (1.0 - alpha) + image2 * alpha
于 2012-11-26T23:14:48.027 に答える
8

これを行うには、次のようにShapelyOpenCVを使用できます。

import cv2
import numpy as np
from shapely.geometry import Polygon

x = [10, 30, 70]
y = [15, 45, 90]
alpha = 0.5 # that's your transparency factor
path = 'path_to_image.jpg'

polygon = Polygon([(x[0], y[0]), (x[1], y[1]), (x[2], y[2]), (x[0], y[2])])
int_coords = lambda x: np.array(x).round().astype(np.int32)
exterior = [int_coords(polygon.exterior.coords)]

image = cv2.imread(path)
overlay = image.copy()
cv2.fillPoly(overlay, exterior, color=(255, 255, 0))
cv2.addWeighted(overlay, alpha, image, 1 - alpha, 0, image)
cv2.imshow("Polygon", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
于 2020-05-28T13:57:29.067 に答える