Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中在图像顶部覆盖多边形_Python_Image Processing_Overlay - Fatal编程技术网

在Python中在图像顶部覆盖多边形

在Python中在图像顶部覆盖多边形,python,image-processing,overlay,Python,Image Processing,Overlay,假设我在PIL中有一个图像 from PIL import Image Image.open(path_to_my_image) 以及两个x点和y点列表 x = ['10', '30', '70'] y = ['15', '45', '90'] 有没有办法在这张图片上用透明度覆盖我的多边形 另外,PIL是一个很好的图书馆吗?还是我应该换一个?(例如,scikits.image,或使用pylab在图像中渲染)。PIL是一个很好的工具: import Image import ImageDraw

假设我在PIL中有一个图像

from PIL import Image
Image.open(path_to_my_image)
以及两个
x
点和
y
点列表

x = ['10', '30', '70']
y = ['15', '45', '90']
有没有办法在这张图片上用透明度覆盖我的多边形


另外,PIL是一个很好的图书馆吗?还是我应该换一个?(例如,
scikits.image
,或使用pylab在图像中渲染)。

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
。我查看了源代码以查找此信息

伊皮顿告诉我:

In [38]: draw.polygon?
...
File:       /usr/lib/python2.7/dist-packages/PIL/ImageDraw.py
这告诉我该去哪里找


要在
img
顶部绘制半透明多边形,请复制图像。一个是复制,在没有alpha的情况下以全色绘制多边形。然后使用将原始图像与副本以设定的
alpha
级别组合。对于每个像素:

out = image1 * (1.0 - alpha) + image2 * alpha
为此,您可以使用以下方法:

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()

好极了有没有一种方法可以进行透明填充?另外,在哪里可以找到
draw.polygon
的选项?(我在这里选中了:但是我找不到一个可接受的选项列表)
polygon
在我传递
fill
参数时,抱怨需要
Integer
。添加
。将('RGBA')
转换为
img=Image。打开(…)
语句。太好了!
convert
语句修复了错误,但我仍然看不到任何透明度。。隐马尔可夫模型。。我尝试使用不同的值作为向量的最后一个标量。@user273158您需要将多边形绘制到不同的图像中,然后使用
blend
composite
将其放入原始图像中。PIL的设计并不是以直观的方式实现透明度。