bunu yapmanın en iyi yolu bir renk yerine Gimp kullanılan "renkli alfa" algoritmasını kullanmaktır. Davanızda mükemmel çalışır. Ben bir açık kaynak piton fotoğraf işlemcisi phatch için PIL kullanarak bu algoritma reimplemented. Uygulamanın tamamını here bulabilirsiniz. Bu saf bir PIL uygulamasıdır ve başka bağımlılıkları yoktur. İşlev kodunu kopyalayabilir ve kullanabilirsiniz. İşte Gimp kullanarak bir örnek:
için Sen renk olarak siyah kullanılarak görüntü üzerinde color_to_alpha
fonksiyonunu uygulayabilirsiniz. Ardından, değiştirmeyi yapmak için resmi farklı bir arka plan rengine yapıştırın. Bu arada
bu uygulama PIL ImageMath modülünü kullanır. Getdata'yı kullanarak piksellere erişmekten çok daha verimlidir.
DÜZENLEME:
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)
ama söylenmesi böyle hiçbir modül adlı çekirdek ve işler Bu sadece bir karmaşaydı. Muhtemelen bir aptalım ama işe yaramadı. Yine de teşekkürler, cevabın, başkalarına yardım edeceğinden eminim. – Cookies
Tüm dosyayı çalıştırmayı denememelisiniz. Sadece color_to_alpha işlevinin kendisini kopyalayın. Her neyse, senin için çalışan bir çözüm bulmana sevindim. Daha verimli bir çözüme ihtiyacınız varsa, nereye bakacağınızı biliyorsunuz;) –
Yaptım ve ilk önce 'OPTIONS' küresel isminin tanımlanmadığını söyledi, bu yüzden o kısmı kopyaladım ve sonra _t tanımlanmadığını söyledi, ama sahip olmadığım bir modül. Dağınıklık demek istediğim buydu, çalışmayı denedim ama yapamadım, benim için işe yarayan aşağıda önerilen yöntem iyi değil, fakat eğer işlevin gerçekten de görüntüdeki tüm arka plan piksellerini çıkarabiliyor olsaydı. Hala tesseract karıştırmak bazı sol vardır. – Cookies