Как перевести систему координат в обычную декартовую? Я работаю с анализом изображений в PythonPython

Программы на Python
Anonymous
Как перевести систему координат в обычную декартовую? Я работаю с анализом изображений в Python

Сообщение Anonymous »

По сути, мой вопрос заключался в том, чтобы найти угол большой полуоси эллипса. для этого я использовал следующий метод:
Сначала я загружаю изображение и конвертирую его в оттенки серого. Затем я бинаризую изображение в оттенках серого, используя порог (пиксели выше порога становятся белыми, а пиксели ниже — черными). Затем переберите каждый пиксель бинаризованного изображения. Если пиксель черный (значение 0), я вычисляю евклидово расстояние между этим пикселем и центром масс (центроидом) эллипса. Максимальное расстояние будет главной осью и координатой пикселя, а центр — двумя координатами, с которыми я могу работать, чтобы получить уравнение главной оси и теты.
Это результат, который я получаю, имеет смысл.
Изображение
Что не имеет смысла, так это координаты максимальной точки и COM. координаты COM составляют около 500 500, тогда как максимальные координаты точки составляют около 270 1000. Но разве координаты максимальной точки не должны быть больше координат COM? Если мы представим линию, соединяющую два креста, то градиент этих двух крестов должен быть положительным, но, используя их, я получаю отрицательный ответ. Я чувствую, что проблема в том, что ось Y начинается с верхнего левого угла, а ось X — с нижнего левого угла. Как это исправить?
import cv2
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt
import math

def euclidean_distance(a, row, col):

return ((a[1] - col) ** 2 + (a[0] - row) ** 2)

def angle(a, row, col):

slope = (a[0] - row) / (a[1] - col)
return math.atan(slope)

# Load the image
image_path = "/Users/yahya2/Desktop/Screenshot 2024-05-29 at 1.17.34 AM.png"
img = cv2.imread(image_path)
a = ndimage.center_of_mass(img)

# Convert the image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Binarize the grayscale image
_, img_bin = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)

# Get the dimensions of the image
rows, cols = img_bin.shape
max_length = 0
max_row, max_col = 0, 0

# Loop through each pixel in the image
for row in range(rows):
for col in range(cols):
# Check if the pixel is black (0)
if img_bin[row, col] == 0:
length = euclidean_distance(a, row, col)
if length > max_length:
max_length = length
max_row, max_col = row, col
print(a[1],a[0])
print(max_col,max_row)
# Calculate the angle
major_axis_angle = angle(a, max_row, max_col)

# Visualize the result
fig, ax = plt.subplots(figsize=(8, 8))
ax.imshow(img, cmap='gray')
plt.scatter(max_col, max_row, color='red', marker='x', s=100)
plt.scatter(a[1], a[0], color='red', marker='x', s=100)
plt.show()

print(major_axis_angle)


Подробнее здесь: https://stackoverflow.com/questions/785 ... am-working

Вернуться в «Python»