2015-08-29 20 views
6

Cách tốt nhất để chuyển đổi hình ảnh RGB thành RGBA trong python bằng cách sử dụng opencv là gì?python OpenCV - thêm kênh alpha vào hình ảnh RGB

Hãy nói rằng tôi có một mảng với hình dạng

(185, 198, 3) - it is RGB 

và khác là alpha mặt nạ với hình dạng (185, 198)

Làm thế nào để hợp nhất chúng lại và lưu vào tập tin?

Trả lời

12

Bạn có thể sử dụng cv2.merge() để thêm kênh alpha để hình ảnh RGB nhất định, nhưng trước tiên bạn cần để phân chia các hình ảnh RGB để R, G and B kênh, theo documentation:

Python: cv2.merge (mv [, dst])

  • mv - mảng đầu vào hoặc vectơ của ma trận được hợp nhất; tất cả các ma trận trong mv phải có cùng kích thước và cùng độ sâu.

Và điều này có thể được thực hiện như:

b_channel, g_channel, r_channel = cv2.split(img) 

alpha_channel = np.ones(b_channel.shape, dtype=b_channel.dtype) * 50 #creating a dummy alpha channel image. 

img_BGRA = cv2.merge((b_channel, g_channel, r_channel, alpha_channel)) 
+0

Tôi đã thử với hình ảnh RGB sử dụng python 2 và opencv 3.1.0-dev, và nó đặt ra lỗi xác nhận vì 'alpha_channel' không có phương thức' depth() '. Dường như nó muốn một vector ma trận nhưng 'np.ones' tạo ra một mảng thứ hai thường xuyên. – spanishgum

+1

Người ta có thể muốn thực hiện 'alpha_channel = alpha_channel.astype (np.uint8)', tức là đảm bảo tất cả các kênh đều có cùng kiểu chữ. –

+0

Đề xuất có giá trị của bạn được chỉnh sửa. – ZdaR

2

Dưới đây là một ví dụ đơn giản khác sử dụng Grabcut, nó giúp để có được thứ tự đúng của các kênh khi lưu hình ảnh trên đĩa vs pyplot.

from matplotlib import pyplot as plt 
import numpy as np 
import cv2 

img = cv2.imread('image.jpg') 

mask = np.zeros(img.shape[:2], np.uint8) 
bgdModel = np.zeros((1,65), np.float64) 
fgdModel = np.zeros((1,65), np.float64) 
rect = (50, 50, 450, 290) 

# Grabcut 
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT) 

r_channel, g_channel, b_channel = cv2.split(img) 
a_channel = np.where((mask==2)|(mask==0), 0, 255).astype('uint8') 

img_RGBA = cv2.merge((r_channel, g_channel, b_channel, a_channel)) 
cv2.imwrite("test.png", img_RGBA) 

# Now for plot correct colors : 
img_BGRA = cv2.merge((b_channel, g_channel, r_channel, a_channel)) 

plt.imshow(img_BGRA), plt.colorbar(),plt.show() 
Các vấn đề liên quan