| | 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 |