| import numpy as np |
|
|
| |
| |
| 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) |
|
|
| |
| Rx = np.array([ |
| [1, 0, 0], |
| [0, np.cos(rx), -np.sin(rx)], |
| [0, np.sin(rx), np.cos(rx)] |
| ]) |
|
|
| |
| Ry = np.array([ |
| [np.cos(ry), 0, np.sin(ry)], |
| [0, 1, 0], |
| [-np.sin(ry), 0, np.cos(ry)] |
| ]) |
|
|
| |
| Rz = np.array([ |
| [np.cos(rz), -np.sin(rz), 0], |
| [np.sin(rz), np.cos(rz), 0], |
| [0, 0, 1] |
| ]) |
|
|
| |
| 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: |
| 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: マスクを適用した画像。 |
| |
| """ |
| |
| |
| |
| |
| 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: マスクを適用した画像。 |
| |
| """ |
| |
| |
| |
| |
| 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 = np.array(points) |
|
|
| |
| center_point = np.mean(points, axis=0) |
| |
| new_points = [] |
| num_points = len(points) |
| for i in range(num_points): |
| if i == num_points -1 and not isClosed: |
| break |
| p1 = points[i] |
| |
| |
| |
| |
| |
| mid_diff = points[(i + 1) % num_points] - p1 |
| mid = p1+(mid_diff/2) |
|
|
| |
| out_vec = mid - center_point |
|
|
| |
| new_point = mid + out_vec * bulge_factor |
| |
| new_points.append(p1) |
| new_points.append(new_point.astype(np.int32)) |
|
|
| return np.array(new_points) |
|
|
|
|
| |
| def create_2d_image(shape): |
| grayscale_image = np.zeros(shape[:2], dtype=np.uint8) |
| return grayscale_image |