Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/30: Рейтинг темы: голосов - 30, средняя оценка - 4.50
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Добавить к коду подсчет яркостей

22.09.2020, 09:49. Показов 7038. Ответов 124
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
                foreach (var p in source)
                {
                    //get pixel from dithering matrix
                    var dithPixel = dith[p.X % dith.Width, p.Y % dith.Height].GetBrightness();
                    //get pixel from source image
                    var pixel = source[p].GetBrightness();
                    //compare
                    res[p] = pixel >= dithPixel ? Color.White : Color.Black;
                }
Вот такой код есть из темы.
Хочу расширить код подсчитывая количество значений яркости dithPixel например в виде структуры [Value, Count], но не могу вспомнить как это сделать через хеши (именованные массивы).
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2020, 09:49
Ответы с готовыми решениями:

Добавить к коду подсчет вызовов функции
помогите добавить подсчет вызовов функции,вообще не знаю,как symbol = 's' height = 3 width = 3 counter = 3 def dec1(f): ...

Подсчёт суммы значений в ячейках по столбцу по коду товара
Для упрощения. Вот есть две таблицы. Первая с двумя столбцами и кучей строк. 1 столбец в ней - это код товара, 2 столбец - цена. Товар...

Добавить комментарии к коду
Здравствуйте. Кто сможет закомментировать код? <script language="JavaScript"> var elements = document.URL.substr(8).split(/\/|\\/); ...

124
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,434
22.09.2020, 13:29
belalugoci, гистограмму, что ли, построить хотите?
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
24.09.2020, 11:59  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
Dictionary<string, Int64> array = new Dictionary<string, Int64>();
var StrDithPixel = dithPixel.ToString();
Int64 n;
if (array.TryGetValue(StrDithPixel, out n))
{
    // ... ключ есть в словаре
    array[StrDithPixel] += 1;
}
else
{
    array.Add(StrDithPixel, 0);
}
по примерам в сети сделал такой вариант.

Добавлено через 9 минут
C#
1
2
3
4
5
foreach (var kvp in array.OrderBy(key => key.Value))
{
    FForm1.Set.textBox1.AppendText(kvp.Key + ": " + kvp.Value + Environment.NewLine);
}
FForm1.Set.textBox1.AppendText(array.Count + Environment.NewLine);
а тут выводим в TextBox на форме с сортировкой по числу вхождений.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
24.09.2020, 12:11
C#
1
2
Dictionary<string, Int64> array = new Dictionary<string, Int64>();
var StrDithPixel = dithPixel.ToString();
Ну никак не мог пройти мимо очередного говнокода...
Щас бы пиксели в строку переводить, чтобы посчитать сколько каких...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,116
Записей в блоге: 2
24.09.2020, 13:15
Цитата Сообщение от Someone007 Посмотреть сообщение
Ну никак не мог пройти мимо
Пустая критика всегда не очень приветствуется.
Критику лучше сопровождать примером правильного решения.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
25.09.2020, 06:33  [ТС]
Я свой вариант представлю позже.

Добавлено через 42 минуты
Цитата Сообщение от belalugoci Посмотреть сообщение
Я свой вариант представлю позже
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    internal static class Dithering
    {
        internal static Bitmap Process2(Bitmap bmp)
        {
            Dictionary<int, int> array = new Dictionary<int, int>();
            using (var source = new ImageWrapper(bmp, true))
            {
                foreach (var p in source)
                {
                    var pixel = source[p].GetBrightness();
                    int PPixel = (int) Math.Truncate(pixel * 1000);
                    int n;
                    if (array.TryGetValue(PPixel, out n))
                        array[PPixel] += 1; // ключ есть в словаре
                    else
                        array.Add(PPixel, 0);
                }
            }
        }
   }
Добавлено через 3 минуты
Цитата Сообщение от belalugoci Посмотреть сообщение
int PPixel = (int) Math.Truncate(pixel * 1000);
Подумал-подумал, да сделал как:
C#
1
int PPixel = (int) (pixel * 1000);
Кто знает, что там в потрошках происходит - не однофигственно ли это?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,116
Записей в блоге: 2
25.09.2020, 09:18
Цитата Сообщение от belalugoci Посмотреть сообщение
Я свой вариант представлю позже
C#
5
Dictionary<int, int> array = new Dictionary<int, int>();
Ещё раз уточню: я не разбирался в цели и алгоритме вашей задачи - у меня сейчас туго со временем.
Но на первый, внешний взгляд, замена string на int выглядит намного лучше.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,116
Записей в блоге: 2
25.09.2020, 18:07
Лучший ответ Сообщение было отмечено Toros1992 как решение

Решение

Цитата Сообщение от belalugoci Посмотреть сообщение
что там в потрошках происходит - не однофигственно ли это?
Что за тип ImageWrapper?
В дефолтных Net такого, вроде, нету.

Добавлено через 2 минуты
int PPixel = (int) Math.Truncate(pixel * 1000) vs int PPixel = (int) (pixel * 1000) - одно и тоже.

Добавлено через 2 минуты
Какой возможный диапазон значений у PPixel ?
Возможно использование обычного массива вместо Dictionary<int, int> array будет эффективнее.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
28.09.2020, 05:41  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что за тип ImageWrapper?
В дефолтных Net такого, вроде, нету.
По ссылке в начале темы есть вложение в другой теме, там полный код проекта.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Какой возможный диапазон значений у PPixel ?
0..999

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Возможно использование обычного массива вместо Dictionary<int, int> array будет эффективнее.
Ранее в других темах вы (форумчане) меня долго обучали пониманию смысла именованных массивов, чтобы исключать проверки "каждый с каждым", собственно ради этого в прошлом проекте и вводился Dictionary, именно поэтому я и создал тему, так как массив с проверками будет генерировать N в квадрате итераций.
Могу заблуждаться, покажите свой вариант.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,116
Записей в блоге: 2
28.09.2020, 08:25
Цитата Сообщение от belalugoci Посмотреть сообщение
Ранее в других темах вы (форумчане) меня долго обучали пониманию смысла именованных массивов, чтобы исключать проверки "каждый с каждым",
Не надо сравнивать "каждый с каждым".
Для чего вы используете int cсловарь?
Чтобы по ключу (индексатору) хранить значения.
Поиск ключа в словаре, это хоть и быстрая операция, но тоже производится не за одну команду: получается хеш код индексатора, по хешу производится поиск по бинарному дереву хешей ключей, в найденной группе производится линейный поиск по значению ключа, извлекается значение связанное с найденным ключом.
Добавление же нового ключа в словарь, часто приводит к необходимости увеличения его ёмкости, а это сложная операция в которой участвует ОС для выделения нового участка памяти и перезапись в него существующих значений.

Сравнительная скорость (с линейным поиском) такой обработки очень сильно зависит от размеров коллекции, от деталей реализации словаря и линейной коллекции, даже слегка зависит от конкретного компьютера.
Но в целом можно принять, что для коллекций до сотни элементов линейный поиск будет быстрее.
У вас тысяча элементов и скорее всего распределённых равномерно по диапазону.
В таком случае словарь будет предпочтительней.


Но я писал не за линейный поиск.
Я писал о замене словаря на массив.
Если диапазон ЦЕЛЫХ ключей заранее известен, то можно объявить массив размером с этот диапазон.
И, так как ключ - это индексатор, использовать его как индекс массива.
Извлечение элемента массива по индексу - это хоть и не атомарная операция, но очень близкая к ней.
Скорость её выполнения в десятки, возможно, в сотни раз выше чем извлечение по ключу из словаря.
Так же не возникает обращений к ОС для изменения размера массива.

Недостаток такого подхода в том, что в случае РАЗРЕЖЕННЫХ ключей и большого их диапазона, для массива может потребоваться ОГРОМНЫЙ размер и большая его часть при этом использоваться не будет.

НО!, для задачи с тысячей, десятком тысяч и даже миллионном простых элементов - размер не существенен.
Поэтому, на мой взгляд, конкретно в этой задаче, создать массив int[1000] будет много эффективнее чем словарь с такой же ёмкостью.

Опять таки - это не заменена хеш-поиска на линейный поиск, вы используете вместо него прямую выборку.
Это совсем другая операция и выполняется она несравнимо быстрее.
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
28.09.2020, 09:37  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
массив int[1000] будет много эффективнее чем словарь с такой же ёмкостью
число уникальных записей зависит от картинки и может быть как 14, 25, 180, так и 524, явно 999 не будет, так как это набор всех возможных яркостей, что-то похожее на градиент.

идею уловил, тогда как быстро и правильно избавляться о нулевых значений? Простым IF?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,116
Записей в блоге: 2
28.09.2020, 09:48
Цитата Сообщение от belalugoci Посмотреть сообщение
идею уловил, тогда как быстро и правильно избавляться о нулевых значений? Простым IF?
А что потом вам надо сделать?

Если надо выбрать наибольшие и определить их индексы (яркости), то самое простое, но возможно не самое быстрое, это использование LINQ.
C#
1
2
int[] arr = ...;
var arrSort = arr.Select((num, ind) => (num, ind)).OrderByDescending(pr => pr.num).ToArray();
ToArray() - можно в конце не добалять.
Есть свои плюсы и минусы у этого метода.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
28.09.2020, 10:02  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А что потом вам надо сделать?
пока ничего кроме min, max, count и вывод по возрастанию, по убыванию.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,116
Записей в блоге: 2
28.09.2020, 10:40
Цитата Сообщение от belalugoci Посмотреть сообщение
пока ничего кроме min, max, count и вывод по возрастанию, по убыванию.
Сделайте тогда простую сортировку с откидывание нулей и проверьте скорость работы.
Сортировка по возрастанию (значений) с игнорированием нулевых элементов.
В результирующем массиве - кортежи значение-индекс(яркость).
C#
1
2
3
4
5
var arrSort = arr
        .Select((num, ind) => (num, ind))
         .Where(pr => pr.num > 0)
        .OrderBy(pr => pr.num)
        .ToArray();
По убыванию выводите маcсив в обратном порядке обычным for.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
28.09.2020, 11:28  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В результирующем массиве
не могу понять что именно теперь в массиве? числа различаются от предыдущего варианта, например есть значения >50000.

По времени исполнения различий нет, картинка 3840х2400 считалась 5,5 сек в первом случае и так же во втором.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,116
Записей в блоге: 2
28.09.2020, 11:55
Цитата Сообщение от belalugoci Посмотреть сообщение
не могу понять что именно теперь в массиве?
Если не ошибся (пишу же здесь - без отладки), то рассчитываю, что в исходном массиве arr яркость это индекс, значение элемента это точек с этой яркостьью.
После сортировки в массиве arrSort - кортежи (num, ind): ind - яркость, num - количество.
В массиве нет элементов с num==0 и от отсортирован по num.

Добавлено через 2 минуты
Цитата Сообщение от belalugoci Посмотреть сообщение
По времени исполнения различий нет, картинка 3840х2400 считалась 5,5 сек в первом случае и так же во втором.
Возможно получение пикселя и его яркости это гораздо более затратная операция чем работа с массивом или словарём яркостей.

Если это время критично для вас и его надо уменьшать, то возможно понадобится прямая работа с массивом пикселей.
Без использования промежуточных методов.
Скорее всего, для этого потребуется небезопасный код.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
28.09.2020, 13:28  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если это время критично для вас и его надо уменьшать, то возможно понадобится прямая работа с массивом пикселей.
Без использования промежуточных методов.
Скорее всего, для этого потребуется небезопасный код.
сколько программирую всегда было непонятно как пишутся всякие фотошопы, игры, когда за доли секунд кроме логики программы считаются сотни кадров, вот Ромеро на ассемблере в 1992 году Doom написал, у него там алгоритм каждый пиксель по маске отрисовывал, чтобы не было рисования пикселов поверх.

Начитался тут всякого, нашел несколько примеров с opencv по работе с изображениями. Возможно отдельной темой лучше оформить, так как будет потребность в эквализации, выравнивании гистограммы (нормализации), квантовании. тема всё та же будет - обработка изображения для подготовки к печати лазерным гравёром.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,116
Записей в блоге: 2
28.09.2020, 13:35
Цитата Сообщение от belalugoci Посмотреть сообщение
сколько программирую всегда было непонятно как пишутся всякие фотошопы, игры, когда за доли секунд кроме логики программы считаются сотни кадров, вот Ромеро на ассемблере в 1992 году Doom написал
Ну, так там прямой доступ в памяти. Весь пиксель (3 или 4 байта) получается одну атомарную операцию чтения.
А здесь безопасный код платформы Net. на чтение всего пикселя несколько десятков (а может и сотен) атомарных операций.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
28.09.2020, 13:39  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ну, так там прямой доступ в памяти. Весь пиксель (3 или 4 байта) получается одну атомарную операцию чтения.
А здесь безопасный код платформы Net. на чтение всего пикселя несколько десятков (а может и сотен) атомарных операций.
Нееее, я писал на ассемблере для VESA, там прямая пересылка данных, аппаратное ускорение, но даже для движения квадратика по экрану требовалось время, а в игре текстуры, полёт пули и т.п. Ладно там Марио не NES, там аппаратная отрисовка слоев была (скролл фона например и карты), а вот на i386 Doom - это круть, там всего-то 25-33 МГц. Сейчас 4 ядра по 3 ГГц а проблема такая же.
0
Эксперт .NET
 Аватар для Usaga
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,434
28.09.2020, 13:58
Так и уровень графики сейчас не ровня тому, что было в девяносто втором)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.09.2020, 13:58
Помогаю со студенческими работами здесь

Добавить комментарии к коду
нужно прокомментировать код mov ax,@data mov ds,ax mov cx,br mov si,offset mas xor ax, ax c1: xor ax, ax mov al, jmp...

Добавить комментарии к коду
Кто нибудь напишите подробный комментарий к коду ни СИ. Можно подробней по &quot;#define size 5&quot; и int a, a и a. ...

Добавить к коду многоадресный делегат
В иерархии, созданной в этой работе «Интерфейсы», добавить использование для проверки всех методов данного класса многоадресный делегат. ...

К готовому коду добавить процедуру
Суммы элементов каждого столбца матрицы X(m,n), имеющих значения в интервале Min…Max. Для столбца. (К ГОТОВОМУ КОДУ ДОБАВИТЬ ПРОЦЕДУРУ)...

К коду добавить вывод в консоль
Нужно вывести массив в консоль. Как ни пытался, то 0 выводит, то ошибки .586 .model flat,stdcall option casemap:none include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru