一、问题展示
1.原始png含蒙版抠图信息:位深度为32位,4通道图像信息,含蒙版背景信息
2.使用opencv读取保存后图像信息:位深度为24位,3通道图像信息,显示了扣除的背景
二、问题分析
1.用cv模块无法识别深度图,但是用matplotlib模块可以
import matplotlib.image as mpimg
img_path='c.jpg'
img=mpimg.imread(img_path)
print('img_shape',img.shape)
2.使用cv的图像处理技术会再次将原始png图像的背景信息读取到
三、解决方法
1.使用ps工具对图像进行24位去除背景蒙版保存;
2.使用wps图像读取工具对图像进行类别转换;
3.代码位深度判断&转换&去除蒙版
#xiao wu
#coding:utf-8
import os
import cv2
import glob
from PIL import Image
import numpy as np
import matplotlib.image as mpimg
#位深度判断&转换#去除蒙版
for filename in files:
#cv模块读取图像信息并打印
img=cv2.imread(filename,cv2.IMREAD_UNCHANGED)
print('cv2 img_shape',img.shape)
#matplotlib模块读取图像信息并打印
img=mpimg.imread(filename)
print('matplotlib img_shape',img.shape)
#去除背景信息
img = Image.open(filename)
img = img.convert('RGBA')
pixdata = img.load()
add_mask = Image.new("RGBA",img.size,(255,255,255))
add_maskdata=add_mask.load()
#逐个像素读取并处理
for y in range(img.size[1]):
for x in range(img.size[0]):
if pixdata[x, y][0] > 0 and pixdata[x, y][1] > 0 and pixdata[x, y][2] > 0 and pixdata[x, y][3] > 0:
add_maskdata[x, y]=pixdata[x, y]
img = img.convert('RGB')
img.save(filename)
四、结果展示
去除背景图像信息:
五、PIL库常见图片处理函数
PIL库
from PIL import Image
属性
Image.mode: 图片的格式,例如灰度’L’, 彩色’RGB’, ‘RGBA’
Image.size: 图片的尺寸大小
Image.info: 图片的信息
方法
Image.open(path): 打开图片
Image.new(mode, size, color=0): 创建新图片,一般用不到
Image.fromarray(array, mode=None): 将numpy数组转换为图片,可以指定mode
Image.frombytes(mode, size, data, coder_name =‘raw’, **args):从字节流中读取图片,coder_name为解码器
Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256): 将图片转换格式,例如由灰度转换为RGB convert('RGB')
Image.crop(box): 截取图片,box是一个(左,上,右,下)的元组,也就是相对于左上角(0,0)的像素值
Image.draft(mode, size):调整图片大小,一个缩略图,格式为mode,大小为size。也就是说你可以将原来很大的图片缩小到你给定的size
Image.getbands(): RGB图返回(‘R’, ‘G’, ‘B’), 灰度图返回(L, ),知道是干什么了的吧
Image.getbbox(): 举个例子,一个512x512的图片会返回(0, 0, 512, 512),分别是(左,上,右,下)
Image.copy(): 复制图片
Image.getextrema(): 返回最大和最小的值(0-255), 如果是灰度图,则返回所有值的最大和最小值(min, max), 如果是RGB图则返回((Rmin, Rmax), (Gmin, Gmax), (Bmin, Bmax))
Image.getpixel((x, y)): 返回给定位置的像素值, 灰度图为单值,RGB图为一维数组
Image.paste(im, box=None, mask=None): 将一张图片粘贴在该图片,box是粘贴的位置,可以是(0, 0)的元组,即(左,上)开始, 也可以是(左,上,右,下),不给定默认为(0, 0)。mask不知道什么意思
Image.putpixel((x, y), value): 在指定位置修改像素值
Image.resize(size, resample=None): 重新调整图片大小,resample不知道什么意思
Image.rotate(angle, resample=None, expand=None): 旋转图片,expand表示是否扩展图片以显示所有内容,默认不扩展,即旋转后的图片和原始图片大小一样
Image.save(fp, format=None): fp可以为文件名或文件对象,一般写文件名就行。format为保存的图片格式,默认根据文件名后缀选择
Image.show(): 在屏幕上显示该图片
Image.split():将图片分割,如果是RGB则分割成R,G,B三个图像
Image.thumbnail(size, resample=1): 同Image.draft
Image.transpose(): 旋转90度,同Image.rotate(90)
Image.verify(): 判断图片是否损坏
Image.close(): 关闭文件指针,一般不需要
相关链接:
PIL库的简单操作_np.ones pil-CSDN博客