1

Тема: віддзеркалювання зображення

оригінал
https://replace.org.ua/uploads/images/9801/8edbe34df66a41589cb4794d5547bd89.jpg

так би мовити, "результат"
https://replace.org.ua/uploads/images/9801/1e5a5c4c67af1f9dd18bcd9504023102.jpg


from collections import deque

def build_balanced_tree(grayscale_data):
    root_node = Node()
    queue = deque([root_node])

    for pixel_value in grayscale_data:
        current_node = queue.popleft()
        current_node.value = pixel_value
        left_child = Node()
        right_child = Node()
        current_node.left = left_child
        current_node.right = right_child
        queue.append(left_child)
        queue.append(right_child)

    return root_node

# Load the original image
original_image = Image.open("/home/user1/tmp/example2.png")

# Convert the image to grayscale
grayscale_image = original_image.convert("L")

# Convert the grayscale image to a binary tree
root_node = build_balanced_tree(grayscale_image.getdata())

# Mirror the binary tree
mirror_root = mirror(root_node)

# Convert the mirrored binary tree back to an image
mirrored_data = []
collect_pixel_values(mirror_root, mirrored_data)
mirrored_image = Image.new("L", (grayscale_image.width, grayscale_image.height))
mirrored_image.putdata(mirrored_data)

# Save the mirrored image
mirrored_image.save("/home/user1/tmp/example2_mirrored.png")

тут я впираюся в обмеження мого внутрішнього "графічно-лексичного інтерпретатора", як саме пояснити словами тому ж ґпт (чи не ґпт, а просто людині котра наприклад в даний момент не може бачити зображення) чим конкретно мене не влаштовує результат і що я б хотів покращити.

2 Востаннє редагувалося Teg Miles (12.04.2023 10:22:40)

Re: віддзеркалювання зображення

Можливо, просто використати спеціалозовану бібліотеку. Pillow, наприклад.

from PIL import Image, ImageOps
im = Image.open('якийсь файл')
im_mirror = ImageOps.mirror(im)

Або OpenCV в поєднанні з Numpy, якщо треба.

3 Востаннє редагувалося frz (12.04.2023 10:39:54)

Re: віддзеркалювання зображення

Забув додати, що тема навіяна вчорашньою співбесідою

https://replace.org.ua/post/181996/#p181996

Практичної потреби у віддзеркалюванні зображень кодом Python в мене нема. Швидше шукаю реальне застосування коду "розвертання бінарних дерев". Те що взагалі щось виходить - вже супер, хоча без ґпт для мене це залишалося б чимсь рівня rocket science.

Цікавить саме як словами пояснити, чому результат мене не влаштовує. Не терміново.

4

Re: віддзеркалювання зображення

frz написав:

Цікавить саме як словами пояснити, чому результат мене не влаштовує

Щоб пояснити, чому вас не влаштовує результат, спершу поясніть (нам), що ви намагались зробити. Це не віддзеркалювання зображення, принаймні не у першому наближенні. Щоб просто віддзеркалити зображення, дерево не потрібно будувати. Це можна зробити набагато простіше. Я так підозрюю ваша задачка з більш специфічної області?.. Computer Vision?

5

Re: віддзеркалювання зображення

Якщо будувати бінарне дерево, краще використати класи.
Окрім того, слід вказати навколо чого(на якому рівні чи рівнях його обертати).
Я б використав двовимірний масив з Numpy для роботи з чорно-білим зображенням.
Це якщо дійсно потрібно наново вигадувати колесо.

6

Re: віддзеркалювання зображення

Все як я написав вище. Пройшов успішно всі рівні тех.співбесід, в тому числі розвертання бінарних дерев. Але ж суті я не знаю. Лише вмію супер швидко тайпати всіма пальцями (поки що лише пальцями на руках). Згодував натайпане в ґпт. Отримав результат. Потім побачив що це був навіть не 4 а 3.5, але інтерв'юер сказав що ок. Я потім подумав - ну ок, але ж для засвоєння матеріалу потрібна задача, яку я б міг зрозуміти на практиці. Так дійшов до тої чупакабра що видно вище, а для символічного зв'язку з задачею на співбесіді взяв зображення дерева. Все.

Нащо йому було мучити бінарні дерева - не знаю. Мабуть це вважається задачею із зірочкою, тому щоб я був вартий отих шалених XYZ єнотів на день, мені дали розв'язати цю задачку.

7

Re: віддзеркалювання зображення

frz написав:

Все як я написав вище. Пройшов успішно всі рівні тех.співбесід, в тому числі розвертання бінарних дерев. Але ж суті я не знаю. Лише вмію супер швидко тайпати всіма пальцями (поки що лише пальцями на руках). Згодував натайпане в ґпт. Отримав результат. Потім побачив що це був навіть не 4 а 3.5, але інтерв'юер сказав що ок. Я потім подумав - ну ок, але ж для засвоєння матеріалу потрібна задача, яку я б міг зрозуміти на практиці. Так дійшов до тої чупакабра що видно вище, а для символічного зв'язку з задачею на співбесіді взяв зображення дерева. Все.

Нащо йому було мучити бінарні дерева - не знаю. Мабуть це вважається задачею із зірочкою, тому щоб я був вартий отих шалених XYZ єнотів на день, мені дали розв'язати цю задачку.

Я б запропонував два варіанти працедавцю:
1) Якщо треба просто віддзеркалити зображення,
то сказав би, що можна використати спеціалізовані, надійні та безкоштовні бібліотеки.
Тобто швидке й просте рішення, що дає ефективний результат.
2) Якщо суть усе таки в перевірці знань на роботу з бінарними деревами,
тоді класи, матриці(якщо зображення) і т.д. Можна пошукати в інеті
рішення для схожих завдань або ж подивитися вихідні коди
тих же спеціалізований бібліотек на зразок Pillow(поглянути як там mirror реалізоване).

8

Re: віддзеркалювання зображення

Vitaliy_Danmer
Це все має сенс. Тільки додам ще важливу деталь як саме це було. Я спершу прийшов на співбесіду з цим дядьком, а там нікого нема. Питаю в рекрутера що за Z, а він мені - ой, вибачте, той дядько дуже зайнятий, мабуть в нього щось в останню мить змінилося. Давайте перенесемо. Ну ок. Приходжу я до нього вчора, а він встиг нормально попитати теорію, а коли дійшло до цього практичного завдання, то він каже "ой, я вже маю бігти, ну в тебе ще 7 хвилин".

Хотів би я подивитися на того генія, який за цей стислий час не лише виконає, а ще й встигне презентувати рішення.

В результаті я йому показав ось це:

Прихований текст
gpt 3.5 написав:
class Node:
    def __init__(self, value=None):
        self.left = None
        self.right = None
        self.value = value

def mirror(root: Node):
    if root is None:
        return None

    root.left, root.right = root.right, root.left

    mirror(root.left)
    mirror(root.right)

    return root

Ну він в поспіху сказав що йому це ок. Але коли я почав опісля тестити, то виявив, що там не передбачено ситуацію коли гілки порожні. Грався далі і дійшов до чупакабри котра вище.

9

Re: віддзеркалювання зображення

Для віддзеркалення дерева не обов'язково бавитись одразу з картинками. Почніть з простішого, зробіть собі масив цілих чисел, з яких ви будуватимете дерево, як тільки ваше дерево будуватиметься так, як ви очікуєте зможете перейти до віддзеркалення. Це якщо вам хочеться зрозуміти саме алгоритм. Плюс, так буде простіше зрозуміти, де щось пішло не так. А потім можна вже і картинки натягувати на це все діло.