使用python从矩形图像创建非矩形图像

时间:2019-09-06 13:30:05

标签: python numpy opencv image-processing python-imaging-library

我有几张700x400的图片,看起来像下面的图片enter image description here

它们由两个区域组成,一个区域由蓝色表示,另一个区域由绿色表示。这些区域由一条线隔开。一个XML文件包含用于分隔这些区域的所有图像(大约60个数组)的线条的单独y轴y轴,如下所示:

<?xml version="1.0" encoding="utf-8"?> 
<Data>
<Image>
<ImageUrl> file:///Data/1.tif </ImageUrl>
<Array> 150 144 169 199 199 200 210 ..... 344 </Array>
</Image>
<Image>
<ImageUrl> file:///Data/2.tif </ImageUrl>
<Array> 150 144 169 199 199 200 210 ..... 344 </Array>
</Image>
.
.
.
</Data>

现在,我想沿着这条线剪切图像ABCD,并且只有绿色区域。我见过this,但无法正常使用。我已经尝试过了:

import xml.etree.ElementTree as ET
import cv2, numpy as np
tree = ET.parse("image.xml")
segArray = tree.findall(".//Image/Array")
arrayList = []
for i in range (0,len(segArray)-1):
xa = segArray[i].text.split(" ")
        arrayList.append(xa)
arrayList = np.array(arrayList)

arrayList存储数组,但是现在我想不出一种使用这些数组来剪切图像的方法。

1 个答案:

答案 0 :(得分:3)

一个关于既没有代表性图像也没有数据的图像处理的问题很难回答,但是我想您想根据某种形式使某些未指定图像的顶部透明到顶部为止一定距离。 XML。

因此,我将以paddington作为输入图像,以正弦波作为XML,并假设您可以适应您想做的任何事情:

enter image description here

并使用PIL / Pillow这样的代码:

#!/bin/env python3

from math import sin,cos
import numpy as np
from PIL import Image

# Create a new alpha mask, initially all white, that makes parts of image transparent
w, h = 700, 400
alpha = np.ones((h,w), dtype=np.uint8)*255

# Draw a vertical black line of length "l" from top downwards at each column position across image
for col in range(w):
    # Length of line is given by a sine wave
    l = abs(int(sin(col/30)*h/3))
    alpha[0:l, col] = 0


# Now open our image and push that alpha layer into it
im = Image.open('image.png').convert('RGB')

im.putalpha(Image.fromarray(alpha))
im.save('result.png')

结果

enter image description here

我创建的Alpha层如下所示,并添加了红色边框,因此您可以在StackOverflow的白色背景上看到其范围:

enter image description here