Spaces:
Runtime error
Runtime error
| 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",is_degree=False): | |
| """ | |
| オイラー角を使って3Dポイントを回転させる関数 | |
| Args: | |
| point: 回転させる3Dポイント (x, y, z) | |
| angles: 各軸周りの回転角度 (rx, ry, rz) [ラジアン] | |
| Returns: | |
| 回転後の3Dポイント (x', y', z') | |
| """ | |
| if is_degree: | |
| angles = [np.deg2rad(value) for value in angles] | |
| 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 |