照片抠图简易代码,不完整。人像保留,其他变黑。
本帖最后由 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)
网络搬运工:
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等的使用接口、机器学习的基础算法调用,从而使得图像处理和图像分析变得更加易于上手,让开发人员更多的精力花在算法的设计上。 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)
6666杠杠滴 简易的也得看头发丝的抠图好不好 感觉已经很不错了,继续加油 不错,代码没看懂,前面那个-是啥子逻辑? 请问复杂背景图形效果怎样?:lol 有没有可以去水印的 简单得有点过了python'的生态圈真好 登记照可能可以,复杂点的估计不行。