zjg121 发表于 2024-3-29 07:09

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

本帖最后由 zjg121 于 2024-3-30 14:14 编辑

20240330:1结果图就是背景透明的png,方便以后加背景;2路径和文件名不能有中文;3结果png调整为25张。如果在核心去加一个判断(核心区像素点,不透明保留结果,透明舍弃结果),就更好了。
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
            # 检查颜色是否为(0, 0, 0)
            if color == (0, 0, 0):
                # 将颜色更改为(1, 0, 0)
                pixels = (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
            # 检查颜色值是否为(0, 0, 0, 255)
            if color == (0, 0, 0, 255):
                # 将颜色值更改为(0, 0, 0, 0)
                pixels = (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, , -1, (0, 0, 0), -1)

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

    # 填充轮廓
    cv2.drawContours(mask, , -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')



https://static.52pojie.cn/static/image/hrline/4.gif

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, , -1, (0, 0, 0), -1)

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

    # 填充轮廓
    cv2.drawContours(mask, , -1, (255, 255, 255), -1)

    '''

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

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

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
有没有可以去水印的

用于黑白文档,灰色水印。三行而已。
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)

csdedison 发表于 2024-3-29 07:13

6666杠杠滴

dx163 发表于 2024-3-29 07:17

简易的也得看头发丝的抠图好不好

棉周 发表于 2024-3-29 07:21

感觉已经很不错了,继续加油

lizy169 发表于 2024-3-29 07:31

不错,代码没看懂,前面那个-是啥子逻辑?

ilpj 发表于 2024-3-29 07:40

请问复杂背景图形效果怎样?:lol

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

页: [1] 2 3 4 5 6
查看完整版本: 照片抠图简易代码,不完整。人像保留,其他变黑。