导读
本文主要介绍使用OpenCV将常用格式图片保存为透明背景图片的方法与实现代码。
实现目标
本文的目标有如下两个:
① 将常见格式[jpg/png/bmp]白色背景图片转换保存为透明背景图片;
② 将常见格式[jpg/png/bmp]复杂背景图片转换保存为透明背景图片。
实现步骤与详细演示
实现步骤:
① 彩色模式加载图片;
② 将图像由BGR颜色空间转换为BGRA颜色空间;
③ 将原图中白色位置的像素值对应A通道均置为0;
④ 将处理后的图像保存为PNG格式。
代码实现与演示:
待处理图像:
处理结果图像:
仔细对比看下区别(白色背景和透明背景):
Alpha通道处理结果(白色部分被保留,黑色部分最终为透明背景):
换个图片试试效果:
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图片即可。
以下面图片为例:
目标是提取中间部分花,然后处理为透明背景。提取花可以将原图的R通道阈值处理后直接作为Alpah通道即可。
R通道分离效果:
二值化效果:
代码实现与最终结果:
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()