import cv2 import numpy as np import os # 读取输入图像 image = cv2.imread('input.jpg') # 检查图像是否读取成功 if image is None: print("无法读取 input.jpg,请确保文件存在且路径正确。") exit() # 获取图像的尺寸 height, width = image.shape[:2] # 创建九个掩码,初始化为全黑 masks = [np.zeros((height, width), dtype=np.uint8) for _ in range(9)] # 定义曲线参数 num_bends = 9 # 弯曲次数 amplitude_h = height / 30 # 横向曲线的最大幅度 amplitude_v = width / 30 # 纵向曲线的最大幅度 # 定义幅度调节函数,使曲线在交点处的幅度为零,并平滑过渡 def amplitude_modifier(pos, center_pos, width): return np.sin(np.pi * (pos - center_pos) / (2 * width)) ** 2 # 定义两条横向曲线(沿着 x 轴变化) x = np.arange(width) frequency_h = num_bends * np.pi / width # 计算横向曲线的幅度调节,使在交点处幅度为零 amplitude_modifier_h1 = 1 - amplitude_modifier(x, width / 3, width / 6) amplitude_modifier_h2 = 1 - amplitude_modifier(x, 2 * width / 3, width / 6) # 计算横向曲线的 y 值 y_h1 = (height / 3) + (amplitude_h * amplitude_modifier_h1) * np.sin(frequency_h * x) y_h2 = (2 * height / 3) + (amplitude_h * amplitude_modifier_h2) * np.sin(frequency_h * x) y_h1 = np.clip(y_h1, 0, height - 1).astype(int) y_h2 = np.clip(y_h2, 0, height - 1).astype(int) # 定义两条纵向曲线(沿着 y 轴变化) y = np.arange(height) frequency_v = num_bends * np.pi / height # 计算纵向曲线的幅度调节,使在交点处幅度为零 amplitude_modifier_v1 = 1 - amplitude_modifier(y, height / 3, height / 6) amplitude_modifier_v2 = 1 - amplitude_modifier(y, 2 * height / 3, height / 6) # 计算纵向曲线的 x 值 x_v1 = (width / 3) + (amplitude_v * amplitude_modifier_v1) * np.sin(frequency_v * y) x_v2 = (2 * width / 3) + (amplitude_v * amplitude_modifier_v2) * np.sin(frequency_v * y) x_v1 = np.clip(x_v1, 0, width - 1).astype(int) x_v2 = np.clip(x_v2, 0, width - 1).astype(int) # 创建掩码 for i in range(height): for j in range(width): y_curve1 = y_h1[j] y_curve2 = y_h2[j] x_curve1 = x_v1[i] x_curve2 = x_v2[i] # 判断所在区域 if i <= y_curve1: if j <= x_curve1: masks[0][i, j] = 255 # 左上角 elif j <= x_curve2: masks[1][i, j] = 255 # 上中 else: masks[2][i, j] = 255 # 右上角 elif i <= y_curve2: if j <= x_curve1: masks[3][i, j] = 255 # 中左 elif j <= x_curve2: masks[4][i, j] = 255 # 中间 else: masks[5][i, j] = 255 # 中右 else: if j <= x_curve1: masks[6][i, j] = 255 # 左下角 elif j <= x_curve2: masks[7][i, j] = 255 # 下中 else: masks[8][i, j] = 255 # 右下角 # 确保输出目录存在 output_dir = 'output' if not os.path.exists(output_dir): os.makedirs(output_dir) # 应用掩码并保存图片 for idx, mask in enumerate(masks): img_part = cv2.bitwise_and(image, image, mask=mask) cv2.imwrite(os.path.join(output_dir, f'output{idx+1}.png'), img_part) print("图片已成功切割成9张,并保存到 'output' 目录下。")