ऐसा करने का सबसे अच्छा तरीका रंग को बदलने के लिए Gimp में "रंग से अल्फा" एल्गोरिदम का उपयोग करना है। यह आपके मामले में पूरी तरह से काम करेगा। मैंने ओएल सोर्स पायथन फोटो प्रोसेसर phatch के लिए पीआईएल का उपयोग करके इस एल्गोरिदम को फिर से कार्यान्वित किया। आप पूर्ण कार्यान्वयन here पा सकते हैं। यह एक शुद्ध पीआईएल कार्यान्वयन है और इसमें अन्य निर्भरता नहीं है। आप फ़ंक्शन कोड कॉपी कर सकते हैं और इसका उपयोग कर सकते हैं। आप रंग के रूप में काले का उपयोग कर छवि पर color_to_alpha
समारोह लागू कर सकते हैं
लिए: यहाँ Gimp का उपयोग कर एक नमूना है। फिर प्रतिस्थापन करने के लिए छवि को एक अलग पृष्ठभूमि रंग पर पेस्ट करें।
वैसे, यह कार्यान्वयन पीआईएल में ImageMath मॉड्यूल का उपयोग करता है। यह Getdata का उपयोग कर पिक्सल तक पहुंचने से कहीं अधिक कुशल है।
संपादित करें:
from PIL import Image, ImageMath
def difference1(source, color):
"""When source is bigger than color"""
return (source - color)/(255.0 - color)
def difference2(source, color):
"""When color is bigger than source"""
return (color - source)/color
def color_to_alpha(image, color=None):
image = image.convert('RGBA')
width, height = image.size
color = map(float, color)
img_bands = [band.convert("F") for band in image.split()]
# Find the maximum difference rate between source and color. I had to use two
# difference functions because ImageMath.eval only evaluates the expression
# once.
alpha = ImageMath.eval(
"""float(
max(
max(
max(
difference1(red_band, cred_band),
difference1(green_band, cgreen_band)
),
difference1(blue_band, cblue_band)
),
max(
max(
difference2(red_band, cred_band),
difference2(green_band, cgreen_band)
),
difference2(blue_band, cblue_band)
)
)
)""",
difference1=difference1,
difference2=difference2,
red_band = img_bands[0],
green_band = img_bands[1],
blue_band = img_bands[2],
cred_band = color[0],
cgreen_band = color[1],
cblue_band = color[2]
)
# Calculate the new image colors after the removal of the selected color
new_bands = [
ImageMath.eval(
"convert((image - color)/alpha + color, 'L')",
image = img_bands[i],
color = color[i],
alpha = alpha
)
for i in xrange(3)
]
# Add the new alpha band
new_bands.append(ImageMath.eval(
"convert(alpha_band * alpha, 'L')",
alpha = alpha,
alpha_band = img_bands[3]
))
return Image.merge('RGBA', new_bands)
image = color_to_alpha(image, (0, 0, 0, 255))
background = Image.new('RGB', image.size, (255, 255, 255))
background.paste(image.convert('RGB'), mask=image)
मैं इस काम करने के लिए प्राप्त करने की कोशिश, लेकिन यह कहा नहीं मॉड्यूल नामित कोर और उस तरह बातें , यह सिर्फ एक गड़बड़ था। मैं शायद बेवकूफ हूं लेकिन मैं इसे काम करने के लिए नहीं मिला। धन्यवाद वैसे भी मुझे यकीन है कि आपका जवाब किसी और की मदद करेगा। – Cookies
आपको पूरी फाइल चलाने की कोशिश नहीं करनी चाहिए। बस color_to_alpha फ़ंक्शन को कॉपी करें। वैसे भी, मुझे खुशी है कि आपको एक समाधान मिला जो आपके लिए काम करता है। यदि आपको अधिक कुशल समाधान की आवश्यकता है, तो आप जानते हैं कि कहां देखना है;) –
मैंने किया, और पहले यह कहा गया कि वैश्विक नाम 'विकल्प' परिभाषित नहीं किया गया है, इसलिए मैंने उस भाग को कॉपी किया और फिर कहा कि यह परिभाषित नहीं है, लेकिन यह था एक मॉड्यूल मेरे पास नहीं था। मैं गड़बड़ी से यही मतलब था, मैंने इसे काम करने की कोशिश की लेकिन वह नहीं कर सका, नीचे दी गई विधि जो मेरे लिए काम करती है ठीक है, लेकिन अगर आपका काम वास्तव में छवि में सभी पृष्ठभूमि पिक्सेल निकाल सकता है जो बहुत अच्छा होगा। अभी भी कुछ बाएं हैं जो टेसरेक्ट को भ्रमित करते हैं। – Cookies