Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Заблокирован

Преобладающий цвет по краями

14.01.2020, 11:53. Показов 676. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
PHP
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Функция, которая определяет "расстояние" между объектами
function getDistance($arr1, $arr2, $l) {
    // Определяется "расстояние машины такси" — так быстрее, но для более точного результата желательно использовать евклидому метрику
    $s = 0;
    for($i = 0; $i < $l; ++$i)
        $s += $arr1[$i] > $arr2[$i] ? ($arr1[$i] - $arr2[$i]) : ($arr2[$i] - $arr1[$i]);
    return $s;
}
 
/*
Сама функция, которая определяет доминирующие цвета
Значения, передаваемые функции:
    $url — путь к картинке на сервере
    $amount — количество цветов, которые надо определить
    $sort — сортировать ли цвета по убыванию встречаемости на картинке
    $maxPreSize — максимальный размер уменьшаемой картинки (подробнее чуть дальше)
    $epselon — минимальное суммарное отклонение, необходимое для выхода из цикла
*/
function getDominantColors($url, $amount = 1, $sort = true, $maxPreSize = 50, $epselon = 1) {
    // Определяем, существует ли указанный файл. Если нет, то выдаём ошибку.
 
    if(!file_exists($url))
        return false;
    // Определяем размер картинки, если это картинка.
    $size = getimagesize($url);
    if($size === false)
        return false;
    $width = $size[0];
    $height = $size[1];
 
    // Определяем формат изображения из заголовка файла и проверяем, есть ли функция, которая может это изображение открыть. Если нет, значит файл — не картинка, и выдаём ошибку.
    $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
    if($format == 'x-ms-bmp')
        $format = 'wbmp';
    $func = 'imagecreatefrom'.$format;
    if(!function_exists($func))
        return false;
    $bitmap = @$func($url);
    if(!$bitmap)
        return false;
 
    // Здесь мы уменьшаем исходную картинку, чтобы иметь дело не со всеми пикселями, а только с некоторыми. Это значительно увеличивает скорость алгоритма. Чем меньше размер — тем меньше точность.
    $newW = $width > $maxPreSize ? $maxPreSize : $width;
    $newH = $height > $maxPreSize ? $maxPreSize : $height;
    $bitmapNew = imagecreatetruecolor($newW, $newH);
    // Для большей точности надо использовать функцию imageCopyResambled, но она тратит очень много времени, поэтому используется быстрая и грубая функция imageCopyResized.
    imageCopyResized($bitmapNew, $bitmap, 0, 0, 0, 0, $newW, $newH, $width, $height);
    // Заносим цвета  всех пикселей в один массив
    $pixelsAmount = $newW * $newH;
    $pixels = Array();
    for($i = 0; $i < $newW; ++$i)
        for($j = 0; $j < $newH; ++$j) {
            $rgb = imagecolorat($bitmapNew, $i, $j);
            $pixels[] = Array(
                ($rgb >> 16) & 0xFF,
                ($rgb >> 8) & 0xFF,
                $rgb & 0xFF
            );
        }
    imagedestroy($bitmapNew);
 
    // Выбираем случайные пиксели для установки центроидов в них
    $clusters = Array();
    $pixelsChosen = Array();
    for($i = 0; $i < $amount; ++$i) {
        // Желательно не ставить несколько центроидов в одну точку
        do {
            $id = rand(0, $pixelsAmount - 1);
        } while(in_array($id, $pixelsChosen));
        $pixelsChosen[] = $id;
        $clusters[] = $pixels[$id];
    }
 
    $clustersPixels = Array();
    $clustersAmounts = Array();
    // Начинаем цикл
    do {
        // Обнуляем хранилище пикселей, принадлежащих текущему центроиду и их счётчик
        for($i = 0; $i < $amount; ++$i) {
            $clustersPixels[$i] = Array();
            $clustersAmounts[$i] = 0;
        }
 
        // Проходимся по всем пикселям и определяем ближайший к ним центроид    
        for($i = 0; $i < $pixelsAmount; ++$i) {
            $distMin = -1;
            $id = 0;
            for($j = 0; $j < $amount; ++$j) {
                $dist = getDistance($pixels[$i], $clusters[$j], 3);
                if($distMin == -1 or $dist < $distMin) {
                    $distMin = $dist;
                    $id = $j;
                }
            }
            $clustersPixels[$id][] = $i;
            ++$clustersAmounts[$id];
        }
 
        // Перемещаем центроид в центр масс пикселей, принадлежащих ему, заодно вычисляем, насколько он сместился
        $diff = 0;
        for($i = 0; $i < $amount; ++$i) {
            if($clustersAmounts[$i] > 0) {
                $old = $clusters[$i];
                for($k = 0; $k < 3; ++$k) {
                    $clusters[$i][$k] = 0;
                    for($j = 0; $j < $clustersAmounts[$i]; ++$j)
                        $clusters[$i][$k] += $pixels[$clustersPixels[$i][$j]][$k];
                    $clusters[$i][$k] /= $clustersAmounts[$i];
                }
                // Будем сравнивать максимальное отклонение
                $dist = getDistance($old, $clusters[$i], 3);
                $diff = $diff > $dist ? $diff : $dist;
            }
        }
    } while($diff >= $epselon);
 
    // Сортировка получившихся кластеров (не помню как метод называется)
    if($sort and $amount > 1)
        for($i = 1; $i < $amount; ++$i)
            for($j = $i; $j >= 1 and $clustersAmounts[$j] > $clustersAmounts[$j - 1]; --$j) {
                $t = $clustersAmounts[$j - 1];
                $clustersAmounts[$j - 1] = $clustersAmounts[$j];
                $clustersAmounts[$j] = $t;
 
                $t = $clusters[$j - 1];
                $clusters[$j - 1] = $clusters[$j];
                $clusters[$j] = $t;
            }
 
    // Значение цвета — величина целая, поэтому её надо округлить
    for($i = 0; $i < $amount; ++$i)
        for($j = 0; $j < 3; ++$j)
            $clusters[$i][$j] = floor($clusters[$i][$j]);
 
    // Очищаем память
    imagedestroy($bitmap);
    // Возвращаем массив, который содержит доминирующие цвета. Каждый цвет — массив, состоящий из 3-х элементов — красный, зелёный и синий канал цвета.
    return implode(',', $clusters[0]);
}
При помощи данной функции, определяем преобладающий цвет на изображении. Вопрос в том, возможно ли предварительно не разрезая изображение. Получить преобладающий цвет скажем по правому и левому краю. Скажем, взять 100px левого края и получить прeобладающий цвет?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2020, 11:53
Ответы с готовыми решениями:

Преобладающий цвет на картинке
Нужно определить преобладающий цвет на картинке (графический файл). Для красного, зеленого, синего вобщем то понятно, а как определять...

Как выделить преобладающий цвет в изображении?
Я использую Emgucv(openCV) для сравнения изображения из папки 1 где примерно 1000 фото и 2 где 70 по общим точкам для нахождения...

Qt кнопка с круглыми краями
Привет! В приложении хочу создать кнопочку, но чтобы она имела круглые края. Как это можно сделать, чтобы кнопка была круглая.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2020, 11:53
Помогаю со студенческими работами здесь

Форма с закругленными краями
Доброго времени суток. Может кто нибудь подсказать как создать форму с закругленными краями?

Трабл с краями отображения
Добрый день. Вот такая досадная проблема: элементы нельзя перетащить в самый край Activity, только по определенным рамкам. А если...

Блок с неровными краями
привет! помогите разобраться. необходимо сделать такой блок этот блок состоит из трех блоков с неровными краями. кто-нибудь...

Map fragment с закругленными краями
Всем прривет, в приложении не сложный интерфейс, но все элементы, а это по большей части imgview, в рамке, рамка это nine patch, картинки...

2D truetype шрифты с гладкими краями
Нужна помощь, как выводить шрифты с гладкими краями? HFONT hFont = CreateFont(-42, 0, 0, 0, FW_BOLD, false, false, false,...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru