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