• 批量解决opencv cv2.imread读取32位抠图png图像后,出现隐藏背景无法去除的问题


    一、问题展示

    1.原始png含蒙版抠图信息:位深度为32位,4通道图像信息,含蒙版背景信息

         

    2.使用opencv读取保存后图像信息:位深度为24位,3通道图像信息,显示了扣除的背景

                   

     

    二、问题分析

          1.用cv模块无法识别深度图,但是用matplotlib模块可以

    1. import matplotlib.image as mpimg
    2. img_path='c.jpg'
    3. img=mpimg.imread(img_path)
    4. print('img_shape',img.shape)

        2.使用cv的图像处理技术会再次将原始png图像的背景信息读取到

    三、解决方法

       1.使用ps工具对图像进行24位去除背景蒙版保存;

       2.使用wps图像读取工具对图像进行类别转换;

    3.代码位深度判断&转换&去除蒙版

    1. #xiao wu
    2. #coding:utf-8
    3. import os
    4. import cv2
    5. import glob
    6. from PIL import Image
    7. import numpy as np
    8. import matplotlib.image as mpimg
    9. #位深度判断&转换#去除蒙版
    10. for filename in files:
    11. #cv模块读取图像信息并打印
    12. img=cv2.imread(filename,cv2.IMREAD_UNCHANGED)
    13. print('cv2 img_shape',img.shape)
    14. #matplotlib模块读取图像信息并打印
    15. img=mpimg.imread(filename)
    16. print('matplotlib img_shape',img.shape)
    17. #去除背景信息
    18. img = Image.open(filename)
    19. img = img.convert('RGBA')
    20. pixdata = img.load()
    21. add_mask = Image.new("RGBA",img.size,(255,255,255))
    22. add_maskdata=add_mask.load()
    23. #逐个像素读取并处理
    24. for y in range(img.size[1]):
    25. for x in range(img.size[0]):
    26. if pixdata[x, y][0] > 0 and pixdata[x, y][1] > 0 and pixdata[x, y][2] > 0 and pixdata[x, y][3] > 0:
    27. add_maskdata[x, y]=pixdata[x, y]
    28. img = img.convert('RGB')
    29. 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博客

  • 相关阅读:
    我没有机器学习的学位,却拿到了 DeepMind 研究工程师的 Offer
    第一次微生物学实验
    RPA能和什么技术结合?
    RobotFramework入门(二)appUI自动化之app启动
    计算机网络学习易错点
    Java框架 MyBatis的缓存
    Linux学习第36天:Linux RTC 驱动实验:时间是一条流淌的河
    C++继承
    原型设计模式
    centos8 php+nginx环境搭建
  • 原文地址:https://blog.csdn.net/weixin_45866058/article/details/136239648