Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Алгоритмы #17

Open
AlexGyver opened this issue Mar 23, 2023 · 27 comments
Open

Алгоритмы #17

AlexGyver opened this issue Mar 23, 2023 · 27 comments

Comments

@AlexGyver
Copy link
Owner

Сейчас имеем, просто закинул для сравнения. 255 нод, 2000 линий
image

@cybernetlab
Copy link

@AlexGyver какой thickness на примерах?

@AlexGyver
Copy link
Owner Author

AlexGyver commented Mar 23, 2023

я сразу SVG смотрю, на нём гораздо лучше отображается. Настройки все сток, кроме количества нод и линий

@AlexGyver
Copy link
Owner Author

AlexGyver commented Mar 23, 2023

Можно подглядеть у https://github.com/dronperminov/StringArtGenerator
UPDATE там то же самое что у нас, но хуже

@Uncomfy
Copy link

Uncomfy commented Mar 23, 2023

1679572196
Те же параметры (255 кольев, 2к линий), но пишу на плюсах.
Больше всего помогло использование квадратичной ошибки и гамма.
Как конверировать в b64 строку? Хочу протестить в SVG

@AlexGyver
Copy link
Owner Author

AlexGyver commented Mar 23, 2023

@Uncomfy выглядит потрясающе :0 ждём реализацию

конвертировать так - вот есть массив с номерами линий. К нему в конце добавляется последним элементом количество гвоздей. А дальше уже по правилам b64, возможно в плюсах есть готовые функции

@Uncomfy
Copy link

Uncomfy commented Mar 23, 2023

untitled (1)
В свг не так классно выглядит :D

@AlexGyver
Copy link
Owner Author

нормально! Брови классные, нос пятачком. Показывай как сделал)

@alfedukovich
Copy link

Увидел в ютубчике что RingString делает несколько вариантов на выбор, видимо разными алгоритмами(или начальной обработкой фото?)
Peek 2023-03-23 16-56

@GyverLibs
Copy link
Contributor

Я думаю там лёгкий рандом параметров, или заданные отклонения считает и показывает

@GyverLibs
Copy link
Contributor

@GyverLibs
Copy link
Contributor

@Uncomfy на словах расскажи хоть как сделал?) Что там по квадратичной ошибке

@Uncomfy
Copy link

Uncomfy commented Mar 26, 2023

Квадратичная ошибка не сильно отличается от обычной рисовалки с негативом
Просто негатив
Негатив + квадратичная ошибка

@Uncomfy
Copy link

Uncomfy commented Mar 26, 2023

У меня не то чтобы получилось сильно лучше в результате
Пример

Поиграться можно тут: https://uncomfy.github.io/braiderv1/

Пара ключевых отличий:

  1. Наличие гаммы. Работает так - взять цвет, перевести его во float в интервале [0, 1], возвести в степень гамма. Помогает выделить детали иногда.
  2. Sobel edge detection. Простой алгоритм для поиска краёв. Использую, чтобы затемнить пиксели в тех местах, где есть края. Тоже помогает выделить детали.

@AlexGyver
Copy link
Owner Author

AlexGyver commented Mar 27, 2023

а как применяешь sobel к исходному изображению? Я его сделал у себя, выдаёт условно ч/б картинку. Потом через "коэффициент" как то накладываешь на основное? Типа комплиментарно, условно oimg.pixels[i] * (1 - k) + bimg.pixels[i] * k; где k от 0 до 1

@AlexGyver
Copy link
Owner Author

Анимация

@AlexGyver
Copy link
Owner Author

Гамма вот такой результат должна давать?
Анимация

@copych
Copy link

copych commented Mar 27, 2023

@AlexGyver гамма должна такой эффект давать , только она и в минус должна регулироваться имхо

@Uncomfy
Copy link

Uncomfy commented Mar 27, 2023

По Sobel'ю: просто умножаю цвет на (1 - sobelResult * edgeDarkening), что затемняет при найденом крае. Может и высветлять, если _edgeDarkening < 0.
Сам код выглядит вот так: grayData[i][j] *= 1.0f - edgeData[i][j] * _edgeDarkening;

По гамме: ее увеличение обычно приводит к затемнению картинки, потому что если значения цвета находятся в интервале [0; 1], то: x^gamma <= x при gamma > 1.0
Гамма может уходить и ниже единицы, тогда картинка будет высветляться, как у тебя, но не ниже нуля, там уже совсем страшные вещи происходят)
В моем коде реализовано вот так: grayData[i][j] = pow(grayData[i][j], _gamma) * _brightness; (_brightness тут неправильно применяется, знаю).
В теории вместо _gamma можно подставить exp(_gamma), тогда ползунок можно будет дергать от минус бесконечности до плюс бесконечности.

@Uncomfy
Copy link

Uncomfy commented Mar 27, 2023

Я еще в последние дни думал над идеей того, что нужно смотреть не на обновление цвета пикселя при выборе линии, а на обновление градиента. То есть (если упрощенно) смотреть, что если на оригинальной картинке пиксели справа светлее, а сейчас левый пиксель светлее, то вертикальная линия по левому пикселю нам очень даже подойдет, независимо от нынешнего цвета пикселя.
Потому что у РингСтринга яркость не сохраняется на том же уровне (хотя я это субъективно говорю, точно не проверял), будто интервал цветов ужимается, зато переходы между цветами сильно более выражены.
Но это так, мысли вслух, пока особо идей для того как это реализовать нет.

@copych
Copy link

copych commented Mar 28, 2023

@AlexGyver сорри, ввел в заблуждение. Гамма не такой результат должна давать. Это получился контраст номер два. Гамма должна средние тона (серый) поднимать/опускать, регулируя прогиб кривой, а черный/белый гамма не затрагивает вообще.
Анимация

@GyverLibs
Copy link
Contributor

Тогда не понял как это работает, у меня точно так же яркость возводится в степень

@GyverLibs
Copy link
Contributor

И тут просто возведение в степень. Ничего не понимаю)

@Uncomfy
Copy link

Uncomfy commented Mar 28, 2023

let val = Math.pow(oimg.pixels[i], exp);
В oimg.pixels точно лежат значения от 0 до 1, а не от 0 до 255?

@AlexGyver
Copy link
Owner Author

нет, у меня 0.. 255) математику позабыл да

@Uncomfy
Copy link

Uncomfy commented Mar 28, 2023

if (ui_get('Gamma') > 1.0) gamma(show);
Гамма применяется только при >1.0

@GyverLibs
Copy link
Contributor

Да, увидел)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants