Используйте Java для определения линий на графике - PullRequest
4 голосов
/ 15 февраля 2009

Я работаю над идеей, в которой мне нужно идентифицировать строки в файле JPG или PNG. Файл PNG содержит один график с одним значением - одна комбинация x, y. Например, график выглядит как Y = mx + c. Я хотел бы идентифицировать линию на графике - если я могу определить положение пикселя в кадре, я верю, что смогу вернуть значения (x, y), которые использовались для построения графика. Предположения здесь - я знаю масштаб, т.е. 1 пиксель = какая единица Y? Может кто-нибудь помочь мне написать код, который будет идентифицировать пиксели определенного цвета в одном файле PNG?

EDIT

Давайте рассмотрим пример. Допустим, у меня есть набор значений данных X и Y, как это -

X = 1, Y = 10
X = 2, Y = 20
X = 3, Y = 30
X = 4, Y = 40
X = 5, Y = 50
X = 6, Y = 60

В этом случае, если я использую инструмент построения диаграмм типа jfreechart и создаю диаграмму, он работает как прямая линия.

Таким образом, входными данными является набор данных, а выходными данными является файл .PNG (с использованием jchart или jfreechart), содержащий этот линейный график для значений Y.

Вопрос в том, что если мы обратим поток назад, сможем ли мы разработать одну программу, которая будет брать файл PNG (который содержит график) и возвращает мне набор данных.

Суть проблемы в том, что я хочу хранить файлы PNG в своем приложении, а не в наборе необработанных данных. Но, учитывая файл PNG, я смогу вернуть свой набор данных.

Ответы [ 4 ]

5 голосов
/ 15 февраля 2009

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

Для первого, сделайте что-то вроде следующего:

    BufferedImage bimg = ImageIO.read(new File("whatever.png"));

    // get the colour of the pixel at position (x, y)
    int col = bimg.getRGB(x, y);

    // decode red, green and blue components of colour if necessary
    int r = (col >> 16) & 0xff;
    int g = (col >> 8) & 0xff;
    int b = col & 0xff;

Если из графика вы просто хотите получить набор данных (т.е. не выводить уравнение из этих данных), то вы по сути перебираете каждую позицию X и находите позицию Y, где есть пиксель цвет, который использует программа построения графиков. Если на графике есть оси, сглаживание и т. Д., То задача будет более сложной.

Задача получения уравнения из данных потенциально намного более сложна, но вы можете начать с проверки некоторых предполагаемых формул, таких как y = mx + c , как вы упомянули , Например, вы можете циклически проверять разницу между каждой позицией Y для последней; если эта разница всегда одна и та же, то у вас есть линейный график (и на этом этапе получение формулы должно быть тривиальным).

Для проверки других уравнений полезно знать немного исчисления. Затем отправной точкой является проверка того, соответствуют ли различия в различиях производной для рассматриваемого уравнения. (Например, если уравнение равно y = ax ^ 2 + c , то при каждом увеличении X увеличение Y само будет увеличиваться на 2a .)

0 голосов
/ 16 июля 2009

Я не уверен, куда вы попали с вашим проектом, но мне нужно было также обнаружить линии на изображении. Вот что мне помогло. http://www.music.mcgill.ca/~cmckay/software/musictech/ScoreReader/HorizontalLineDetection.html

0 голосов
/ 15 февраля 2009

Правильно ли я прочитал: у вас есть изображение одной строки на холсте, в противном случае пустом? Если это так, вы можете просто взглянуть вниз на крайний левый столбец пикселей и найти другой пиксель, затем взять столбец немного вправо и найти пиксель там. Теперь у вас есть две точки, и генерация линейной функции из этого тривиальна. Как единица, почему бы не использовать пиксели?

0 голосов
/ 15 февраля 2009

Как правило, на мониторе компьютера нет центральной точки (0,0), так как эта точка определяется как верхний левый угол экрана. Поэтому, если мы смотрим на функцию f(x)=ax+b, тогда параметр b определяется как значение y функции в x=0, что означает левую границу экрана. Поэтому важно точно определить, от чего вы компенсируете.

Чтобы найти наклон, просто наведите центральную точку на экране, которая, как вы знаете, у вас есть точка функции, перейдите на x пикселей влево или вправо, найдите y дельту высоты и y/x - это наклон функции или параметр a в вышеупомянутой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...