导读

本文主要介绍使用OpenCV将常用格式图片保存为透明背景图片的方法与实现代码。

实现目标

本文的目标有如下两个:

① 将常见格式[jpg/png/bmp]白色背景图片转换保存为透明背景图片;

② 将常见格式[jpg/png/bmp]复杂背景图片转换保存为透明背景图片。

实现步骤与详细演示

实现步骤:

① 彩色模式加载图片;

② 将图像由BGR颜色空间转换为BGRA颜色空间;

③ 将原图中白色位置的像素值对应A通道均置为0;

④ 将处理后的图像保存为PNG格式。

代码实现与演示:

待处理图像:

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_背景图片

处理结果图像:

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_透明背景_02

仔细对比看下区别(白色背景和透明背景):

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_透明背景_03

Alpha通道处理结果(白色部分被保留,黑色部分最终为透明背景):

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_透明背景_04

换个图片试试效果:

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_透明背景_05

Python-OpenCV实现代码:


import cv2
import numpy as np

img = cv2.imread("opencv.jpg")
cv2.imshow('src', img)
print(img.shape)

result = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)

for i in range(0,img.shape[0]): #访问所有行
for j in range(0,img.shape[1]): #访问所有列
if img[i,j,0] > 200 and img[i,j,1] > 200 and img[i,j,2] > 200:
result[i,j,3] = 0

cv2.imwrite('result.png', result, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])
print(result.shape)
cv2.imshow('result', result)
B,G,R,A = cv2.split(result)
cv2.imshow('B', B)
cv2.imshow('G', G)
cv2.imshow('R', R)
cv2.imshow('A', A)

cv2.waitKey()
cv2.destroyAllWindows()

如果图片背景复杂一点怎么办?万变不离其宗,只要将你想要保留的部分的Alpha通道对应部分灰度值变为255,不想保留的部分Alpha通道对应部分灰度值变为0,然后保存为PNG图片即可。

以下面图片为例:

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_灰度值_06


目标是提取中间部分花,然后处理为透明背景。提取花可以将原图的R通道阈值处理后直接作为Alpah通道即可。

R通道分离效果:

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_灰度值_07


二值化效果:


OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_背景图片_08

代码实现与最终结果:


import cv2
import numpy as np

img = cv2.imread("flower.jpg")
cv2.imshow('src', img)
print(img.shape)

result = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)

B,G,R = cv2.split(img)

_, Alpha= cv2.threshold(R, 200, 255, cv2.THRESH_BINARY)
cv2.imshow('thres', Alpha)

B2,G2,R2,A2 = cv2.split(result)
A2 = Alpha
result = cv2.merge([B2,G2,R2,A2]) #通道合并

cv2.imwrite('result.png', result)
print(result.shape)
cv2.imshow('result', result)
B,G,R,A = cv2.split(result)
cv2.imshow('B', B)
cv2.imshow('G', G)
cv2.imshow('R', R)
cv2.imshow('A', A)

cv2.waitKey()
cv2.destroyAllWindows()

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_背景图片_09

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo_透明背景_10



当然,制作透明背景图片我们也可以使用PPT里面的删除背景功能,请看下面操作:




更多视觉图像处理相关内容,请长按关注:OpenCV与AI深度学习。