<p>这里有一个枕头版本的<a href="https://stackoverflow.com/a/67192747/11089932">my answer using OpenCV and NumPy</a>,包含了相同的想法。然而,此版本仅限于两种颜色。添加更多颜色(或多边形)需要额外的工作(基本上是一些循环)</p>
<pre class="lang-py prettyprint-override"><code>from PIL import Image, ImageChops, ImageDraw
# Set up image
w, h = (400, 300)
img = Image.new('RGB', (w, h), (255, 255, 255))
draw_img = ImageDraw.Draw(img)
# Set up colors
colors = {
'Red': (0, 0, 255),
'Blue': (255, 0, 0)
}
# Set up lines per color, first element is the point in common
lines = {
'Red': [((200, 150), (380, 0)), ((200, 150), (200, 0))],
'Blue': [((100, 100), (399, 100)), ((100, 100), (300, 0))]
}
# Set up masks per color
masks = {
'Red': Image.new('L', (w, h), 0),
'Blue': Image.new('L', (w, h), 0)
}
# For each color...
for c in ['Red', 'Blue']:
draw_mask = ImageDraw.Draw(masks[c])
for line in lines[c]:
# ... draw colored line in image, ...
draw_img.line(line, colors[c], 2)
# ... draw white line in mask, ...
draw_mask.line(line, 255, 1)
# ... find mid point between both end points, and ...
mid = (int(sum([line[1][0] for line in lines[c]]) / len(lines[c])),
int(sum([line[1][1] for line in lines[c]]) / len(lines[c])))
# ... flood fill mask with the mid point as seed point
ImageDraw.floodfill(masks[c], mid, 255)
# Logical and all masks, and check for at least one pixel overlap
inter = ImageChops.multiply(masks['Red'], masks['Blue'])
print('Is intersection: ', inter.getextrema()[1] > 0)
# Outputs
img.show()
masks['Red'].show()
masks['Blue'].show()
inter.show()
</code></pre>
<p>输出与OpenCV版本相同</p>
<pre class="lang-none prettyprint-override"><code>----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
PyCharm: 2021.1
Pillow: 8.2.0
----------------------------------------
</code></pre>