2013-10-24 9 views
5

के साथ एक और छवि पर पेस्ट करें, मैं सही अल्फा/रंग मिश्रण के साथ एक पारदर्शी पृष्ठभूमि के साथ एक छवि को पारदर्शी पृष्ठभूमि के साथ चिपकाने के साथ एक स्पर्श को संघर्ष कर रहा हूं।पीआईएल - छवि अल्फा

यहां कुछ उदाहरण छवियों, red.png और blue.png हैं:

:

red.pngblue.png

मैं red.png के शीर्ष पर blue.png पेस्ट, और इस प्रभाव को प्राप्त करना चाहते हैं

Expected Result

वह छवि फ़ोटोशॉप में दो छवियों के संयोजन से बनाई गई थी, बस दो परतों के रूप में।

निकटतम मैं पायथन इमेजिंग लाइब्रेरी का उपयोग कर सकते हैं है:

from PIL import Image 

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

आप देखते हैं कि कैसे अल्फा और रंग है, जहां दो बंद है कार्य करें:

Actual Result

इस कोड के साथ

मंडल ओवरलैप? अपेक्षित परिणाम छवि में, लाल और नीले मिश्रण एक बैंगनी तरीके से मिलते हैं, लेकिन वास्तविक परिणाम छवि में एक अवांछित अल्फा हेलो है।

मैं पीआईएल में अपना आदर्श परिणाम कैसे प्राप्त कर सकता हूं?

उत्तर

3

निकटतम मुझे मिल गया alpha_composite समारोह का उपयोग किया गया here पाया। वास्तव में अच्छी तरह से काम करता है!

1

मैं आमतौर पर छवि प्रसंस्करण कार्यों के लिए numpy/scipy के लिए घूमता हूं, हालांकि मेरा पहला अनुभव (एक अच्छा) पीआईएल के साथ था। इस तरह मुझे यकीन नहीं है कि नीचे आपकी आवश्यकताओं को पूरा करेगा या नहीं।

एक विशेष पिक्सेल 1 दिया गया, छवि 1 से अल्फा 1 और पिक्सेल 2, अल्फा 2 के साथ, image2 से, 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 

उपरोक्त परिभाषाओं का उपयोग हम मूल रूप से से योगदान प्रत्येक पिक्सेल के लिए पहली छवि है, तो इसके अल्फा नक्शा लागू करने के बाद दूसरी छवि में जोड़ने की गणना करेगा

हम सीधे रूप में 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() 
+0

धन्यवाद प्राप्त करने के लिए कर सकते हैं, लगभग क्या मैं के बाद हूँ, काले रंग की पृष्ठभूमि के बावजूद मैं पाने के लिए लग रहे हैं। अल्फा समग्र एल्गोरिदम मैंने नीचे एक लिंक पोस्ट किया है, ऐसा लगता है कि मैं थोड़ा बेहतर परिणामों के साथ जाना चाहता था। – DizzyDoo

0

दो छवियों को ओवरलैप करने के लिए मिश्रण() का उपयोग करें। एक फ़ोल्डर में कोड ओवरलैप छवियों के नीचे। आप अल्फा का मूल्य बदल जवाब पॉल के लिए एकदम सही सम्मिश्रण

listing = os.listdir("images2/") 
alpha = 2.0 
for file in listing: 
    im = Image.open(path1 + file) 
    new_img = Image.blend(im, new_img, alpha) 
new_img.save("new008.png","PNG")