Initial commit
This commit is contained in:
196
04extract_borders_slim.py
Normal file
196
04extract_borders_slim.py
Normal file
@@ -0,0 +1,196 @@
|
||||
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")
|
||||
Reference in New Issue
Block a user