实际对图片进行处理的时候,经常会碰到单一颜色背景的情况,这时候就可以采用图像处理的方法,将该单一颜色去除,形成一个透明的图片。如果需要,还可以加上新的背景图,图片就焕然一新了。
删除图片某种颜色,Pillow或OpenCV都可以实现。实现的思路都是一致的,就是将图片转换为带透明通道的格式,然后设置透明度为0。
Pillow库的实现,采用image.convert('RGBA'),然后查找相应的颜色,最后设置透明通道为0
OpenCV库的实现,采用cv2.cvtColor(img1, cv2.COLOR_BGR2BGRA),然后查找相应的颜色,最后设置透明通道为0。
以下是实现的效果,图一是原图,图二是pillow去除背景后的图,图三是OpenCV支除背景后的图。刚好去除的背景颜色为(237,237,237)。
在代码运行过程中,发现用pillow的实现速度,要比OpenCV要快速很多,比较建议使用。下面是图片与实现代码。
import cv2
from PIL import Image
def calc_diff(pixel, bg_color):
# 计算pixel与背景的离差平方和,作为当前像素点与背景相似程度的度量
return (pixel[0] - bg_color[0]) ** 2 + (pixel[1] - bg_color[1]) ** 2 + (pixel[2] - bg_color[2]) ** 2
def remove_one_color_opencv(): # 采用opencv方式
delete_color = [237, 237, 237]
threshold = 13
image_path = "example3.png"
img1 = cv2.imread(image_path)
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2BGRA) # 将图像转成带透明通道的BGRA格式
for i in range(img1.shape[0]):
for j in range(img1.shape[1]):
if calc_diff(img1[i][j], delete_color) < threshold:
img1[i][j] = (255, 255, 255, 0)
cv2.imwrite("output2.png", img1)
def remove_one_color_pillow(): # 采用pillow方式
delete_color = [237, 237, 237]
threshold = 13
image_path = "example3.png"
img2 = Image.open(image_path)
img2 = img2.convert('RGBA')
pixdata = img2.load()
for y in range(img2.size[1]):
for x in range(img2.size[0]):
if calc_diff(pixdata[x, y], delete_color) < threshold:
pixdata[x, y] = (255, 255, 255, 0)
img2.save("output1.png")
if __name__ == '__main__':
remove_one_color_pillow()
remove_one_color_opencv()