60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
import cv2
|
|
import numpy as np
|
|
import math
|
|
|
|
# === Parameters ===
|
|
input_path = "input_image.png" # replace with your image filename
|
|
output_path = "radial_output.png"
|
|
canvas_size = 1000 # output size (square)
|
|
num_sections = 8 # 8 radial triangles (45° each)
|
|
|
|
# === Load and prepare image ===
|
|
img = cv2.imread(input_path, cv2.IMREAD_UNCHANGED)
|
|
img = cv2.resize(img, (canvas_size, canvas_size))
|
|
|
|
# Convert to grayscale if needed
|
|
if img.ndim == 3:
|
|
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
else:
|
|
img_gray = img.copy()
|
|
|
|
# === Create mask for one triangular wedge ===
|
|
center = (canvas_size // 2, canvas_size // 2)
|
|
radius = canvas_size // 2
|
|
angle_step = 360 / num_sections
|
|
angle1 = -angle_step / 2
|
|
angle2 = angle_step / 2
|
|
|
|
# Create polygon points for wedge
|
|
pts = np.array([
|
|
center,
|
|
(int(center[0] + radius * math.cos(math.radians(angle1))),
|
|
int(center[1] + radius * math.sin(math.radians(angle1)))),
|
|
(int(center[0] + radius * math.cos(math.radians(angle2))),
|
|
int(center[1] + radius * math.sin(math.radians(angle2))))
|
|
], np.int32)
|
|
|
|
mask = np.zeros_like(img_gray)
|
|
cv2.fillConvexPoly(mask, pts, 255)
|
|
|
|
# === Extract the wedge from input image ===
|
|
wedge = cv2.bitwise_and(img_gray, mask)
|
|
|
|
# === Prepare output canvas ===
|
|
output = np.zeros_like(img_gray)
|
|
|
|
# === Paste rotated copies of the wedge into all sections ===
|
|
for i in range(num_sections):
|
|
angle = i * angle_step
|
|
rot_mat = cv2.getRotationMatrix2D(center, angle, 1.0)
|
|
rotated = cv2.warpAffine(wedge, rot_mat, (canvas_size, canvas_size))
|
|
output = cv2.bitwise_or(output, rotated)
|
|
|
|
# === Optional: enhance lines for visibility ===
|
|
output = cv2.threshold(output, 10, 255, cv2.THRESH_BINARY)[1]
|
|
|
|
# === Save result ===
|
|
cv2.imwrite(output_path, output)
|
|
|
|
print(f"✅ Radial design saved as {output_path}")
|