Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 12.12.2009
Сообщений: 45
1

Работа с большим объемом данных

26.05.2016, 10:57. Показов 843. Ответов 4
Метки нет (Все метки)

Имеется загруженное изоображение с помощью opencv.
Задача: вывести цвета изображения с из колличеством.
Цвет задаю структурой, хранящей 3 int, RGB соответственно.
Цвета считаются одинаковыми, если евклидовое расстояние между ними меньше eps.
Все пиксели загоняю в map, выводится примерно 200 тыс цветов с их колличеством.
Вопрос: как учесть цвета с помощью евклидового расстояния в этом map?

Добавлено через 10 часов 15 минут
Вот структура:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
struct ObjColor
{
    int B;
    int G;
    int R;
 
    bool operator< (const ObjColor& other) const
    {   
        //double dist = sqrt((this->B - other.B)*(this->B - other.B) + (this->G - other.G)*(this->G - other.G) + (this->R - other.R)*(this->R - other.R));
 
        //if (dist>30)
        {
            // сортировка идет от меньшего к большему
            if (this->B < other.B)
            {
                return true;
            }
            if (this->B == other.B)
            {
                if (this->G < other.G)
                {
                    return true;
                }
                if (this->G == other.G)
                {
                    return (this->R < other.R);
                }
            }
        }       
        return false;
    }       
 
};
Ее записываю в map:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
map<ObjColor, double> Class1::CountMyColor(IplImage *Image)
{
    map <ObjColor, double> color;
 
    ObjColor temp;
 
    for (int y = 0; y < image->height; y += 1) {
        uchar* ptr = (uchar*)(image->imageData + y * image->widthStep);
        for (int x = 0; x < image->width; x++) {
            temp.B = ptr[3 * x];
            temp.G = ptr[3 * x + 1];
            temp.R = ptr[3 * x + 2];
            color[temp]++;
        }
 
    }
    return color;
}
Теперь из множества ключей map. Надо отобрать те, расстояние, между которыми < eps, и слить в один цвет, с подсчетом общего количества пикселей для слитого цвета.

Расстояние определяется по формуле:
D := SQRT ((R2-R1)^2+(G2-G1)^2+(B2-B1)^2)
Как это лучше сделать? Думал, перегрузить у структуры < таким образом, чтобы считалось автоматически. Возможно ли это? В закомментированном коде структуры пробовал это.

Или может лучше записывать изначально в unordered_map и там перегружать ==, но не знаю, как записать вычисление хэш функции в этом случае.

Или попросту в массиве это вычислить. Подскажите, как тогда. Что-то результаты не очень((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2016, 10:57
Ответы с готовыми решениями:

QtSerialPort Работа с большим объемом данных
Добрый день. Я пишу приложение, которое работает с последовательным портом при помощи...

Поиск в файлах с большим объемом
Здравствуйте!Подскажите пожалуйста как в qt запрограммировать БЫСТРЫЙпоиск в файлах с большим...

Почему код, написанный на С++, в разы быстрее работает с большим объемом памяти, чем с маленьким?
Привет! Понадобилось мне сравнить скорость работы идентичных алгоритмов на Fortran и C++. Алгоритм...

Сделать ProgressBar при зависании формы (работа с большим количеством данных)
Здравствуйте, нужно сделать progress bar на исполнение кода. Суть в том, что иде работа с большими...

4
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,234
26.05.2016, 13:48 2
petrov522, подсчет расстояния обязателен или оценку близости можно взять в виде модуля разности всех компонентов менее заданной точности? это снизило бы сложность и дало бы возможность заменить все это дело кубической решеткой

Добавлено через 1 минуту
как вариант - в начале загнать все счетчики настоящих цветов в куб в узлах которого будут списки счетчиков настоящих цветов построенный на решетке с шагом 2 * eps / sqrt(3) что бы могло захватить диагональные цвета. потом пробежать по всем узлам куба и объединить цвета с дистанцией менее eps лежащие в одном списке. цвет получаемый после объединения вычислять с использованием веса настоящего цвета равного его счетчику. из за дрейфа цвета получаемого после объединения возможно придется повторять эту процедуру до тех пор пока слияние не прекратиться. кроме того дрейф приводит к тому что решение будет чувствительно к точке из которой начинается перебор

Добавлено через 3 минуты
поэтому я склоняюсь к тому что бы не использовать дистанцию а просто делать куб на сетке 2 * eps
1
1 / 1 / 0
Регистрация: 12.12.2009
Сообщений: 45
29.05.2016, 20:47  [ТС] 3
Интересная идея. Спасибо!! Вот все думал, и над этой идеей, и способами. Пока сделал более простой способ. Свел все имебщиеся цвета к цветам заданным таблицей.
0
Модератор
3331 / 2115 / 343
Регистрация: 13.01.2012
Сообщений: 8,234
29.05.2016, 20:59 4
petrov522, как?
0
1 / 1 / 0
Регистрация: 12.12.2009
Сообщений: 45
31.05.2016, 00:26  [ТС] 5
vxg, задал цвета (в инете можно взять, например, таблицу html цветов, их 216), загнал в массив.
Далее прохожусь по значениям пикселей изображения. Считаем по формуле расстояние между цветами и выбираем табличный цвет для пикселя изоображения с минимальным расстоянием.

Добавлено через 3 минуты
В данном случае может получится, что цвет пикселя сильно не похож на табличный, т.к. табличных цветов не хватает для охвата. В этом случае можно ввести eps, и если минимальное расстояние до табличного цвета больше eps, то либо не относим его к табличным, либо его самого вносим в таблицу.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2016, 00:26

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

работа с большим объемом данных
большим я называю от 300000Rx50C судя по информации из диспетчера задач происходит накопление...

Работа с большим объемом данных
Коллеги, подскажите по такому вопросу. Есть выборка, несколько миллионов записей. Каким образом...

Работа с большим объёмом данных
Приветствую всех! На днях столкнулся с такой проблемой: необходимо отправить на сервер файл...

Работа с большим объемом данных
Всем привет! Работа с большим объемом данных заставляет задуматься над всевозможными способами...

Работа с большим объемом данных
Всем привет! Всегда создавал коллекцию List&lt;List&lt;xxx&gt;&gt;, заносил в нее данные из txt файла, а потом...

Cron задание, работа с большим объемом данных
К примеру есть скрипт, который должен делать коррекцию данных на сайте. Данных много и к примеру...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.