Перемещение точек по сфере не вызывает искажений при проецировании на равноугольную карту.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Перемещение точек по сфере не вызывает искажений при проецировании на равноугольную карту.

Сообщение Anonymous »

Я пытаюсь получить точки из изображения, спроецировать их на сферу, переместить точки по сфере, а затем преобразовать их обратно для моделирования тектоники плит. Код для получения точек с изображения работает нормально, а вот функции, связанные с перемещением точек, не работают. Я ожидаю полярного искажения, но форма в основном просто транслируется.

Код: Выделить всё

def __detect_shapes(image):
img = Image.open(image)

img = img.convert("L")
img = img.point(lambda p: p > 128 and 255)
img = img.convert("RGB")

# get a list of every black pixel
black_pixels = []

for x in range(img.width):
for y in range(img.height):
if img.getpixel((x, y)) == (0, 0, 0):
black_pixels.append((x, y))

# separate the black pixels into shapes
black_pixels = set(black_pixels)
shapes = []

while black_pixels:
shape = []
stack = [black_pixels.pop()]

while stack:
x, y = stack.pop()
shape.append((x, y))
for dx in range(-1, 2):
for dy in range(-1, 2):
if (dx, dy) == (0, 0):
continue

neighbor = (x + dx, y + dy)

if neighbor in black_pixels:
stack.append(neighbor)
black_pixels.remove(neighbor)

shapes.append(shape)

return shapes

def __move_point(point, width, height, dx, dy):
lambda_0 = width / 2
phi_1 = height / 2

map_point = __convert_to_map_space(point, width, height)
spherical_point = __convert_to_spherical(map_point, lambda_0, phi_1)
new_point = __rotate_point(spherical_point, dx, -dy)
equirectangular_point = __convert_to_equirectangular(new_point, lambda_0, phi_1)
x, y = __convert_to_image_space(equirectangular_point, width, height)

return (int(x), int(y))

def __convert_to_map_space(point, width, height, map_width=360, map_height=180):
x, y = point

_x = (x / width) * map_width - (map_width / 2)
_y = (y / height) * map_height - (map_height / 2)

return (_x, _y)

def __convert_to_spherical(point, lambda_0, phi_1):
x, y = point # point is in degrees

x = np.deg2rad(x)
y = np.deg2rad(y)

cos_phi_1 = np.cos(np.deg2rad(phi_1))
lambda_0 = np.deg2rad(lambda_0)

r = 1
_lambda = (x / cos_phi_1) + lambda_0
_phi = y

return (r, _phi, _lambda)

# dtheta and dphi are in DREGREES
def __rotate_point(point, dphi, dtheta):
r, theta, phi = point # point is in radians

phi += np.deg2rad(dphi)
theta += np.deg2rad(dtheta)

return (r, theta, phi)

def __convert_to_equirectangular(point, lambda_0, phi_1):
_, _phi, _lambda = point # point is in radians

lambda_0 = np.deg2rad(lambda_0)

x = (_lambda - lambda_0) * np.cos(phi_1)
y = _phi

return (x, y)

def __convert_to_image_space(point, width, height, map_width=360, map_height=180):
_x, _y = point # point is in radians

_x = np.rad2deg(_x)
_y = np.rad2deg(_y)

x = _x + (map_width / 2) # recenter
x = (x / map_width) * width # scale

y = _y + (map_height / 2)
y = (y / map_height) * height

return (x, y)

output = Image.new("RGB", (512, 256), (255, 255, 255))
draw = ImageDraw.Draw(output)

shapes = __detect_shapes("import/test.png")

for s in shapes:
for p in s:
draw.point(p, fill="black")

for p in shapes[1]:
moved_point = __move_point(p, 512, 256, -50, 90)
draw.point(moved_point, fill="red")

output.save("export/test.png")
output.show()
Вот тестовое изображение:
Три черные фигуры
Изображение

Вот результат после запуска программы:

те же три черные фигуры, но самая правая передвинута вверх

Изображение

И вот чего я (примерно) ожидал:

Те же три черные фигуры, но самая правая была перемещено вверх и искажено

Изображение
Почему нет искажений в результате работы программы?

Подробнее здесь: https://stackoverflow.com/questions/787 ... onto-a-equ
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Преобразование кубических карт в равноугольную панораму с помощью графического процессора
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Преобразование кубических карт в равноугольную панораму с помощью графического процессора
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Создание короткого d-плотного списка точек на сфере S^4 в Python
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Равномерно распределить n точек на сфере
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • 3D-куб при проецировании выглядит как кубоид [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

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