Files
jigsaw/04extract_borders_slim.py
2024-12-03 11:34:51 +13:00

197 lines
6.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
from PIL import Image
import numpy as np
def get_edge_opaque_pixels_with_limit_filtered_colors(image_path):
"""
提取图片中每一行和每一列最左、最右、最上、最下的完全不透明像素alpha == 255
并根据位置限制过滤去掉位置和alpha通道。
Args:
image_path (str): 图片文件路径。
Returns:
dict: 包含四个边的颜色信息列表。
"""
with Image.open(image_path).convert("RGBA") as img:
width, height = img.size
pixels = img.load()
limit_left = width / 3
limit_right = 2 * width / 3
limit_top = height / 3
limit_bottom = 2 * height / 3
left_colors = []
right_colors = []
top_colors = []
bottom_colors = []
# 左边
for y in range(height):
for x in range(width):
r, g, b, a = pixels[x, y]
if a == 255 and x <= limit_left:
left_colors.append((r, g, b))
break
# 右边
for y in range(height):
for x in range(width - 1, -1, -1):
r, g, b, a = pixels[x, y]
if a == 255 and x >= limit_right:
right_colors.append((r, g, b))
break
# 上边
for x in range(width):
for y in range(height):
r, g, b, a = pixels[x, y]
if a == 255 and y <= limit_top:
top_colors.append((r, g, b))
break
# 下边
for x in range(width):
for y in range(height - 1, -1, -1):
r, g, b, a = pixels[x, y]
if a == 255 and y >= limit_bottom:
bottom_colors.append((r, g, b))
break
return {
"left": left_colors,
"right": right_colors,
"top": top_colors,
"bottom": bottom_colors
}
def get_edge_opaque_pixels_with_limit_filtered_colors_numpy(image_path):
"""
使用NumPy提取图片中每一行和每一列最左、最右、最上、最下的完全不透明像素alpha == 255
并根据位置限制过滤去掉位置和alpha通道。
Args:
image_path (str): 图片文件路径。
Returns:
dict: 包含四个边的颜色信息列表。
"""
with Image.open(image_path).convert("RGBA") as img:
data = np.array(img)
height, width, _ = data.shape
limit_left = width / 3
limit_right = 2 * width / 3
limit_top = height / 3
limit_bottom = 2 * height / 3
left_colors = []
right_colors = []
top_colors = []
bottom_colors = []
# 左边
for y in range(height):
row = data[y, :, :]
opaque_indices = np.where(row[:, 3] == 255)[0]
valid_indices = opaque_indices[opaque_indices <= limit_left]
if valid_indices.size > 0:
x = valid_indices[0]
r, g, b, _ = row[x]
left_colors.append((int(r), int(g), int(b)))
# 右边
for y in range(height):
row = data[y, :, :]
opaque_indices = np.where(row[:, 3] == 255)[0]
valid_indices = opaque_indices[opaque_indices >= limit_right]
if valid_indices.size > 0:
x = valid_indices[-1]
r, g, b, _ = row[x]
right_colors.append((int(r), int(g), int(b)))
# 上边
for x in range(width):
column = data[:, x, :]
opaque_indices = np.where(column[:, 3] == 255)[0]
valid_indices = opaque_indices[opaque_indices <= limit_top]
if valid_indices.size > 0:
y = valid_indices[0]
r, g, b, _ = column[y]
top_colors.append((int(r), int(g), int(b)))
# 下边
for x in range(width):
column = data[:, x, :]
opaque_indices = np.where(column[:, 3] == 255)[0]
valid_indices = opaque_indices[opaque_indices >= limit_bottom]
if valid_indices.size > 0:
y = valid_indices[-1]
r, g, b, _ = column[y]
bottom_colors.append((int(r), int(g), int(b)))
return {
"left": left_colors,
"right": right_colors,
"top": top_colors,
"bottom": bottom_colors
}
def process_directory_filtered(directory_path, use_numpy=False):
"""
遍历指定文件夹下所有图片文件,提取每张图片的边缘不透明像素颜色信息。
Args:
directory_path (str): 文件夹路径。
use_numpy (bool): 是否使用NumPy加速处理。
Returns:
dict: 每个文件对应的四个方向的颜色信息列表。
"""
supported_extensions = ('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff')
result_map = {}
for filename in os.listdir(directory_path):
if filename.lower().endswith(supported_extensions):
file_path = os.path.join(directory_path, filename)
if use_numpy:
edge_colors = get_edge_opaque_pixels_with_limit_filtered_colors_numpy(file_path)
else:
edge_colors = get_edge_opaque_pixels_with_limit_filtered_colors(file_path)
result_map[filename] = edge_colors
return result_map
if __name__ == "__main__":
directory_path = "output4" # 替换为你的文件夹路径
use_numpy = True # 设置为True使用NumPy优化False使用PIL
result = process_directory_filtered(directory_path, use_numpy)
for filename, edges in result.items():
print(f"文件: {filename}")
# 左边
print(" 左边的最左不透明像素颜色:")
for color in edges["left"]:
print(f" 颜色: {color}")
# 右边
print(" 右边的最右不透明像素颜色:")
for color in edges["right"]:
print(f" 颜色: {color}")
# 上边
print(" 上边的最上不透明像素颜色:")
for color in edges["top"]:
print(f" 颜色: {color}")
# 下边
print(" 下边的最下不透明像素颜色:")
for color in edges["bottom"]:
print(f" 颜色: {color}")
print("\n")