5

ある画像を透明な背景で別の画像に貼り付けたり、背景を透明にしたり、適切なアルファ/カラーブレンディングを使用して貼り付けたりするのに苦労しています。

red.png と blue.png の画像の例を次に示します。

red.png blue.png

red.png の上に blue.png を貼り付けて、この効果を実現したい:

期待される結果

その画像は、Photoshop で 2 つの画像を単純に 2 つのレイヤーとして結合することによって作成されました。

Python Imaging Library を使用して取得できる最も近いものは次のとおりです。

実結果

このコードで:

from PIL import Image

blue = Image.open("blue.png")
red = Image.open("red.png")
red.paste(blue, (0,0), blue)
red.save("result.png")

2 つの円が重なっている部分でアルファと色がずれているのがわかりますか? 予想される結果の画像では、赤と青が紫がかった方法で混ざり合っていますが、実際の結果の画像には不要なアルファ ハローがあります。

PIL で理想的な結果を得るにはどうすればよいですか?

4

3 に答える 3

3

私が得た最も近いものは、ここにある alpha_composite 関数を使用することでした。本当にかなりうまく機能します!

于 2013-10-25T09:43:48.823 に答える
1

私の最初の経験 (良い経験) は PIL でした。そのため、以下があなたのニーズを満たすかどうかはわかりません.

image1 からの alpha1 を持つ特定の pixel1 と、image2 からの alpha2 を持つ特定の pixel2 が与えられると、outputPixel は次のようになります。

alpha1>=alpha2 then outputPixel = (alpha1-alpha2)*pixel1 + alpha2*pixel2
alpha1==alpha2 then outputPixel = 0*pixel1 + alpha2*pixel2 note in this case alpha1-alpha2 equals 0
alpha1<alpha2 then outputPixel = 0*pixel1 + alpha2*pixel2

上記の定義を使用して、基本的に各ピクセルの最初の画像からの寄与を計算し、アルファ マップを適用した後にこれを 2 番目の画像に追加します。

これは imshow から直接取得することもできます

r1 = scipy.misc.imread('red.png')
b1 = scipy.misc.imread('blue.png')
r1 = r1.astype(numpy.float32)
b1 = b1.astype(numpy.float32)

alpha1 = r1[:,:,3]
alpha2 = b1[:,:,3]

#scale the alpha mattes to keep resulting alpha'd images in display range
alpha1Scaled = alpha1 / 255
alpha2Scaled = alpha2 / 255
diff1 = alpha1Scaled - alpha2Scaled

i1 = r1[:,:,0:3]
i2 = b1[:,:,0:3]
#create the alpha mapped images
d1 = numpy.zeros(i1.shape)
d2 = numpy.zeros(i2.shape)
for z in range(3):
    d1[:,:,z] =(diff1>=0)*diff1*i1[:,:,z] 
    d2[:,:,z] = i2[:,:,z]*alpha2Scaled

#belend the result
result = d1 + d2

#rescale in case of overflow
resultScaled = 255*(result/result.max())

#to display 
imshow(( resultScaled  ).astype(uint8))
show()

#note the below gives us the same result
figure()
imshow(red)
imshow(blue)
show()
于 2013-10-24T16:17:42.437 に答える