好友
阅读权限 20
听众
最后登录 1970-1-1
本帖最后由 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)
免费评分
查看全部评分