सफेद पृष्ठभूमि पर JPEG के रूप में पारदर्शी PNG को सहेजना
कहो कि मेरे पास एक बीजीआरए छवि है जो numpy
सरणी के रूप में है जो इस तरह से बहुत सुंदर लगती है:
[[[233 228 230 128]
[233 228 230 128]
[233 228 230 0]
...
[164 160 159 65]
[199 197 196 65]
[255 255 254 120]]
यह बहुत सीधा दिखता है - तीन रंग चैनल + एक अल्फा जो पिक्सेल की पारदर्शिता को नियंत्रित करता है। PNG प्रारूप में उस सुन्न सरणी को सहेजने से एक छवि बनती है जो अर्ध-पारदर्शी है जैसा कि होना चाहिए।
हालाँकि, इसे JPEG के रूप में सहेजते समय, अल्फा चैनल को पूरी तरह से हटा दिया जाता है और सभी पिक्सेल पूरी तरह से अपारदर्शी होते हैं।
जेपीईजी अल्फा-पारदर्शिता का समर्थन नहीं करता है, मैं चाहूंगा कि मेरी अर्ध-पारदर्शी छवि (ऊपर दी गई सुरीली सरणी) को इसके बजाय एक सफेद पृष्ठभूमि पर सहेजा जाए। इस तरह, ऐसा प्रतीत होगा जैसे कि पिक्सेल अभी भी अर्ध-पारदर्शी होंगे।
मैं पूरी तरह से सफेद पृष्ठभूमि पर अर्ध-पारदर्शी सुपीरियर सरणी को कैसे ओवरले कर सकता हूं? मैं मुख्य रूप से सुन्न और OpenCV का उपयोग कर रहा हूं।
जवाब
मुझे लगता है कि आप सरल अल्फा-थ्रॉल्डिंग की तुलना में श्रेणीबद्ध अल्फा-सम्मिश्रण की तलाश कर रहे हैं जो फ्रेड के उत्तर को अच्छी तरह से प्रदर्शित करता है।
मैंने परीक्षण उद्देश्यों के लिए बीच में एक अल्फा ग्रेडिएंट के साथ एक नमूना छवि बनाई। यहाँ यह एक सामान्य छवि के रूप में है और फोटोशॉप जैसी पारदर्शिता दिखाने के लिए एक बिसात पर रचना की गई है:


अल्फा सम्मिश्रण करने के लिए आप सूत्र का उपयोग करते हैं:
result = alpha * Foreground + (1-alpha)*Background
जहां मान सभी फ़्लोट्स 0. रेंज पर स्केल किए गए हैं
काले और फिर सफेद पृष्ठभूमि पर सम्मिश्रण का कोड इस प्रकार है:
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image, including gradient alpha layer
im = cv2.imread('GradientAlpha.png', cv2.IMREAD_UNCHANGED)
# Separate BGR channels from A, make everything float in range 0..1
BGR = im[...,0:3].astype(np.float)/255
A = im[...,3].astype(np.float)/255
# First, composite image over black background using:
# result = alpha * Foreground + (1-alpha)*Background
bg = np.zeros_like(BGR).astype(np.float) # black background
fg = A[...,np.newaxis]*BGR # new alpha-scaled foreground
bg = (1-A[...,np.newaxis])*bg # new alpha-scaled background
res = cv2.add(fg, bg) # sum of the parts
res = (res*255).astype(np.uint8) # scaled back up
cv2.imwrite('OverBlack.png', res)
# Now, composite image over white background
bg = np.zeros_like(BGR).astype(np.float)+1 # white background
fg = A[...,np.newaxis]*BGR # new alpha-scaled foreground
bg = (1-A[...,np.newaxis])*bg # new alpha-scaled background
res = cv2.add(fg, bg) # sum of the parts
res = (res*255).astype(np.uint8) # scaled back up
cv2.imwrite('OverWhite.png', res)
यह इस काले पर देता है:

और यह सफेद पर:

कीवर्ड : इमेज प्रोसेसिंग, पायथन, ओपनसीवी, अल्फा, अल्फा ब्लेंडिंग, अल्फा कंपोजिंग, ओवरले।
पायथन ओपनसीवी नेम्पी में, आप अल्फा चैनल को छवि से अलग कर सकते हैं। तो अगर imgA अल्फा चैनल के साथ छवि है। फिर आरजीबी इमेज (img) और अल्फा चैनल (अल्फा) को अलग करें
img = imgA[:,:,0:3]
alpha = imgA[:,:,3]
फिर आईएमजी का रंग सफेद करने के लिए सेट करें जहां अल्फा काला है
img[alpha == 0] = (255,255,255)