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

2021-08-20 15:17:37 浏览数 (1)

导读

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

实现目标

本文的目标有如下两个:

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

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

实现步骤与详细演示

实现步骤:

① 彩色模式加载图片;

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

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

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

代码实现与演示:

待处理图像:

处理结果图像:

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

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

换个图片试试效果:

Python-OpenCV实现代码:

代码语言:javascript复制
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图片即可。

以下面图片为例:

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

R通道分离效果:

二值化效果:

代码实现与最终结果:

代码语言:javascript复制
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()

0 人点赞