吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3276|回复: 51
收起左侧

[Python 原创] 照片抠图简易代码,不完整。人像保留,其他变黑。

  [复制链接]
zjg121 发表于 2024-3-29 07:09
本帖最后由 zjg121 于 2024-3-30 14:14 编辑

20240330:1结果图就是背景透明的png,方便以后加背景;2路径和文件名不能有中文;3结果png调整为25张。如果在核心去加一个判断(核心区像素点,不透明保留结果,透明舍弃结果),就更好了。
[Python] 纯文本查看 复制代码
import cv2
import numpy as np
from PIL import Image


def change_color(image_path):
    # 打开图片
    img = Image.open(image_path)
    # 获取图片的宽度和高度
    width, height = img.size
    # 加载图片的像素数据
    pixels = img.load()

    # 遍历图片的每个像素点
    for x in range(width):
        for y in range(height):
            # 获取当前像素点的颜色
            color = pixels[x, y]
            # 检查颜色是否为(0, 0, 0)
            if color == (0, 0, 0):
                # 将颜色更改为(1, 0, 0)
                pixels[x, y] = (1, 0, 0)


def convert_color(output_path):
    # 打开图片
    img = Image.open(output_path)
    # 获取图片的宽度和高度
    width, height = img.size
    # 加载图片的像素数据
    pixels = img.load()

    # 遍历图片的每个像素
    for x in range(width):
        for y in range(height):
            # 获取当前像素的颜色值
            color = pixels[x, y]
            # 检查颜色值是否为(0, 0, 0, 255)
            if color == (0, 0, 0, 255):
                # 将颜色值更改为(0, 0, 0, 0)
                pixels[x, y] = (0, 0, 0, 0)

    # 保存修改后的图片
    img.save(output_path)


image_path = 'd:/a/5.jpg'
change_color(image_path)
# 读取图片,路径不能有中文
image = cv2.imread(image_path)

# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

for i in range(25):
    # 二值化处理 让阈值变化,抠图结果就不同
    _, binary = cv2.threshold(gray, 10 + i * 10, 255, cv2.THRESH_BINARY)

    # 自动选择合适的参数,使二值化后的图片一半黑,一半白
    # _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    # 寻找轮廓
    contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 创建一个全白的mask
    mask = np.ones_like(image) * 255

    # 填充轮廓
    cv2.drawContours(mask, [max(contours, key=cv2.contourArea)], -1, (0, 0, 0), -1)

    '''
    # 创建一个全黑的mask
    mask = np.zeros_like(image)

    # 填充轮廓
    cv2.drawContours(mask, [max(contours, key=cv2.contourArea)], -1, (255, 255, 255), -1)

    '''

    # 将mask应用到原图上
    result = cv2.bitwise_and(image, mask)

    # 保存结果
    cv2.imwrite('D:/a/result_' + str(i).zfill(2) + '.png', result)

    # 打开三通道的PNG图像
    img = Image.open('D:/a/result_' + str(i).zfill(2) + '.png')

    # 创建一个新的四通道图像,大小和输入图像相同,模式为RGBA
    new_img = Image.new("RGBA", img.size)

    # 将原始图像的数据复制到新图像的前三个通道
    new_img.paste(img, (0, 0))

    # 将第四个通道设置为完全透明
    alpha = Image.new("L", img.size, 255)
    new_img.putalpha(alpha)

    # 保存新的四通道PNG图像
    new_img.save('D:/a/result_' + str(i).zfill(2) + '.png')

    convert_color('D:/a/result_' + str(i).zfill(2) + '.png')





[Python] 纯文本查看 复制代码
import cv2
import numpy as np

# 读取图片,路径不能有中文
image = cv2.imread('d:/a/4.jpg')

# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

for i in range(11):
    # 二值化处理 让阈值变化,抠图结果就不同
    _, binary = cv2.threshold(gray, 30 + i * 20, 255, cv2.THRESH_BINARY)

    # 自动选择合适的参数,使二值化后的图片一半黑,一半白
    # _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    # 寻找轮廓
    contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 创建一个全白的mask
    mask = np.ones_like(image) * 255

    # 填充轮廓
    cv2.drawContours(mask, [max(contours, key=cv2.contourArea)], -1, (0, 0, 0), -1)

    '''
    # 创建一个全黑的mask
    mask = np.zeros_like(image)

    # 填充轮廓
    cv2.drawContours(mask, [max(contours, key=cv2.contourArea)], -1, (255, 255, 255), -1)

    '''

    # 将mask应用到原图上
    result = cv2.bitwise_and(image, mask)

    # 保存结果
    cv2.imwrite('D:/a/result_' + str(i).zfill(2) + '.png', result)
    


结果示例.png
3.jpg
结果示例1.png
5.jpg

免费评分

参与人数 5吾爱币 +10 热心值 +5 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
rwkk12138 + 1 + 1 我很赞同!
9382968 + 1 用心讨论,共获提升!
smartfind + 1 + 1 谢谢@Thanks!
gym66777 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

evill 发表于 2024-3-29 08:26
网络搬运工:

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。

在计算机视觉项目的开发中,OpenCV作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。此外,OpenCV还提供了Java、python、cuda等的使用接口、机器学习的基础算法调用,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上。
 楼主| zjg121 发表于 2024-3-30 22:43
MsBruce 发表于 2024-3-29 08:48
有没有可以去水印的

用于黑白文档,灰色水印。三行而已。
[Python] 纯文本查看 复制代码
import cv2
import numpy as np

# 打开原图
img = cv2.imread('d:/a/7.png')

# 调节对比度增加百分之三十(1.3),调节亮度减少百分之十(-50)
new = np.clip(1.4 * img - 50, 0, 255).astype(np.uint8)

# 保存处理后的图片
cv2.imwrite('d:/a/removed.png', new)

removed.png
7.png
csdedison 发表于 2024-3-29 07:13
dx163 发表于 2024-3-29 07:17
简易的也得看头发丝的抠图好不好
棉周 发表于 2024-3-29 07:21
感觉已经很不错了,继续加油
lizy169 发表于 2024-3-29 07:31
不错,代码没看懂,前面那个-是啥子逻辑?
ilpj 发表于 2024-3-29 07:40
请问复杂背景图形效果怎样?
Python666999 发表于 2024-3-29 07:43
有没有可以去水印的
qinyao0126 发表于 2024-3-29 07:54
简单得有点过了  python'的生态圈真好
winxpnt 发表于 2024-3-29 07:55
登记照可能可以,复杂点的估计不行。
头像被屏蔽
KMT-jiang 发表于 2024-3-29 07:59
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 12:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表