import numpy as np #2024-12-03 rotate_point_euler #2024-12-04 load_data def load_data(filepath): """ カンマ区切りのテキストファイルからデータをNumPy配列に読み込みます。 Args: filepath: データファイルのパス Returns: NumPy配列: 読み込まれたデータ。エラーが発生した場合はNone。 """ try: data = np.loadtxt(filepath, delimiter=",") return data except (FileNotFoundError, ValueError) as e: print(f"Error loading data: {e}") return None def rotate_point_euler(point, angles,order="xyz"): """ オイラー角を使って3Dポイントを回転させる関数 Args: point: 回転させる3Dポイント (x, y, z) angles: 各軸周りの回転角度 (rx, ry, rz) [ラジアン] Returns: 回転後の3Dポイント (x', y', z') """ rx, ry, rz = angles point = np.array(point) # X軸周りの回転 Rx = np.array([ [1, 0, 0], [0, np.cos(rx), -np.sin(rx)], [0, np.sin(rx), np.cos(rx)] ]) # Y軸周りの回転 Ry = np.array([ [np.cos(ry), 0, np.sin(ry)], [0, 1, 0], [-np.sin(ry), 0, np.cos(ry)] ]) # Z軸周りの回転 Rz = np.array([ [np.cos(rz), -np.sin(rz), 0], [np.sin(rz), np.cos(rz), 0], [0, 0, 1] ]) # 回転行列の合成 (Z軸 -> Y軸 -> X軸 の順で回転) order = order.lower() if order == "xyz": R = Rx @ Ry @ Rz elif order == "xzy": R = Rx @ Rz @ Ry elif order == "yxz": R = Ry @ Rx @ Rz elif order == "yzx": R = Ry @ Rz @ Rx elif order == "zxy": R = Rz @ Rx @ Ry else:#zyx R = Rz @ Ry @ Rx # 回転後のポイントを計算 rotated_point = R @ point return rotated_point def apply_binary_mask_to_color(base_image,color,mask): """ 二値マスクを使用して、画像の一部を別の画像にコピーする。 Args: base_image (np.ndarray): コピー先の画像。 paste_image (np.ndarray): コピー元の画像。 mask (np.ndarray): 二値マスク画像。 Returns: np.ndarray: マスクを適用した画像。 """ # TODO check all shape #print_numpy(base_image) #print_numpy(paste_image) #print_numpy(mask) if mask.ndim == 2: condition = mask == 255 else: condition = mask[:,:,0] == 255 base_image[condition] = color return base_image def apply_binary_mask_to_image(base_image,paste_image,mask): """ 二値マスクを使用して、画像の一部を別の画像にコピーする。 Args: base_image (np.ndarray): コピー先の画像。 paste_image (np.ndarray): コピー元の画像。 mask (np.ndarray): 二値マスク画像。 Returns: np.ndarray: マスクを適用した画像。 """ # TODO check all shape #print_numpy(base_image) #print_numpy(paste_image) #print_numpy(mask) if mask.ndim == 2: condition = mask == 255 else: condition = mask[:,:,0] == 255 base_image[condition] = paste_image[condition] return base_image def pil_to_numpy(image): return np.array(image, dtype=np.uint8) def extruce_points(points,index,ratio=1.5): """ indexのポイントをratio倍だけ、点群の中心から、外側に膨らます。 """ center_point = np.mean(points, axis=0) if index < 0 or index > len(points): raise ValueError(f"index must be range(0,{len(points)} but value = {index})") point1 =points[index] print(f"center = {center_point}") vec_to_center = point1 - center_point return vec_to_center*ratio + center_point def bulge_polygon(points, bulge_factor=0.1,isClosed=True): """ ポリゴンの辺の中間に点を追加し、外側に膨らませる ndarrayを返すので注意 """ # 入力 points を NumPy 配列に変換 points = np.array(points) # ポリゴン全体の重心を求める center_point = np.mean(points, axis=0) #print(f"center = {center_point}") new_points = [] num_points = len(points) for i in range(num_points): if i == num_points -1 and not isClosed: break p1 = points[i] #print(f"p{i} = {p1}") # 重心から頂点へのベクトル #vec_to_center = p1 - center_point # 辺のベクトルを求める mid_diff = points[(i + 1) % num_points] - p1 mid = p1+(mid_diff/2) #print(f"mid = {mid}") out_vec = mid - center_point # 重心からのベクトルに bulge_vec を加算 new_point = mid + out_vec * bulge_factor new_points.append(p1) new_points.append(new_point.astype(np.int32)) return np.array(new_points) # image.shape rgb are (1024,1024,3) use 1024,1024 as 2-dimensional def create_2d_image(shape): grayscale_image = np.zeros(shape[:2], dtype=np.uint8) return grayscale_image