Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Лунев
0 / 0 / 1
Регистрация: 28.02.2014
Сообщений: 58
1

Преобразование картинки

18.02.2016, 12:32. Просмотров 626. Ответов 13
Метки нет (Все метки)

Вопрос на миллион как из такой картинки
Преобразование картинки

сделать вот такую картинку
Преобразование картинки

код разный но суть я надеюсь донес
подскажи как это сделать
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2016, 12:32
Ответы с готовыми решениями:

Преобразование картинки в текст
Вопрос очень странный, и я не уверен, что смогу получить на него ответ. Может...

Класс Bitmap, преобразование размеров картинки с picturebox
мне нужна помощь тоесть небольшая потсказка Bitmap img = new...

Преобразование текста
Здравствуйте. По заданию имеется textBox1 в который вводится текст, кнопка...

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

Преобразование чисел.
ребята, я написал программу, она читает hex файл, открывает, преобразовывает и...

13
Sanya_sa
Модератор
727 / 707 / 306
Регистрация: 03.02.2015
Сообщений: 4,506
Записей в блоге: 8
Завершенные тесты: 3
18.02.2016, 13:59 2
1) Наложить сетку и посчитать значение цветности пикселей в каждой ячейке.
2) Построить (нарисовать) то что получилось
0
Лунев
0 / 0 / 1
Регистрация: 28.02.2014
Сообщений: 58
18.02.2016, 14:03  [ТС] 3
а как ее наложить сетку
0
Sanya_sa
Модератор
727 / 707 / 306
Регистрация: 03.02.2015
Сообщений: 4,506
Записей в блоге: 8
Завершенные тесты: 3
18.02.2016, 14:09 4
например картинка размером 120x120 - для сетки 10x10 => 120 / 10 = 12 пиксилей) Вот и все.
Затем перебираете все квадратики 12x12, а вкаждом квадратике перебираем пиксели. Считаем процентное отношение черного к белому и собственно все) (Арифметика 3 класс)

C#
1
2
3
4
5
6
7
8
9
for(int i = 0; i < 10; i++)
{
 
   for(int j = 0;j < 12;l++)
   {
 
   }
 
}
0
Лунев
0 / 0 / 1
Регистрация: 28.02.2014
Сообщений: 58
18.02.2016, 14:15  [ТС] 5
Ужас я тупой я сдаюсь
если алгоритм не сложный напишите пожалуйста
0
Sanya_sa
Модератор
727 / 707 / 306
Регистрация: 03.02.2015
Сообщений: 4,506
Записей в блоге: 8
Завершенные тесты: 3
18.02.2016, 14:17 6
Цитата Сообщение от Лунев Посмотреть сообщение
напишите пожалуйста
Я же его написал ))
0
Лунев
0 / 0 / 1
Регистрация: 28.02.2014
Сообщений: 58
18.02.2016, 14:18  [ТС] 7
нет вы не поняли что бы рисовал(восстанавливал,дорисовывал....) я в край тупой
вот вижу код а применить не могу
0
Storm23
18.02.2016, 15:27
  #8

Не по теме:

Цитата Сообщение от Лунев Посмотреть сообщение
Вопрос на миллион
Согласен сделать за пол-миллиона. Да, я демпингую :D

0
Storm23
Эксперт .NETАвтор FAQ
6569 / 3981 / 1448
Регистрация: 11.01.2015
Сообщений: 5,151
Записей в блоге: 32
19.02.2016, 22:39 9
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Лунев, ну раз миллион никто не дал, рассказываю даром (точнее под GPL3)
По пунктам:
1) Поскольку изначальное изображение немного повернуто, то сразу наложить сетку не получится. Сначала нужно выровнять изображение. Для этого можно применить метод описанный здесь. Там же можно взять исходник. Загрузив исходное изображение, получаем выровненное:
Преобразование картинки


2) Далее я буду опираться на исходники, приведенные выше по ссылке и просто добавлю в программу небольшой метод:
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
34
35
36
37
38
39
40
        private void FindDataMatrix(Bitmap rotated)
        {           
            //находим вертикальный и горизонтальный компакт
            var vert = new Compact(rotated, 3, false, InterpolationMode.High);
            var horiz = new Compact(rotated, 3, true, InterpolationMode.High);
 
            //находим отступы матрицы от краев
            var vertPadding = vert.FindPadding();
            var horizPadding = horiz.FindPadding();
 
            //вырезаем матрицу
            var bmp = new Bitmap(horizPadding.Length, vertPadding.Length);
            using (var gr = Graphics.FromImage(bmp))
                gr.DrawImage(rotated, -horizPadding.From, -vertPadding.From);
 
            //шаг ячеек матрицы
            var stepW = 1f * bmp.Width / 16;
            var stepH = 1f * bmp.Height / 16;
 
            //считаем суммарное число черных точек в каждой ячейке матрицы
            var matrix = new int[16, 16];
            using (var wr = new ImageWrapper(bmp, true))
            foreach(var p in wr)
            if(wr[p].G < 127)
            {
                var i = p.X / stepW;
                var j = p.Y / stepH;
                if(i < 16 && j < 16)
                    matrix[(int)i, (int)j]++;
            }
 
            //создаем изображение 16x16 и ставим пиксел черным, если в матрице в этой ячейке более 25% черных пикселов
            var bmp2 = new Bitmap(16, 16);
            using (var wr = new ImageWrapper(bmp2))
                foreach (var p in wr)
                    wr[p] = matrix[p.X, p.Y] > 16*16/4 ? Color.Black : Color.White;
 
            //выводим результат
            pbRight.Image = bmp2;
        }
В этот метод передается уже повернутое изображение. Затем строятся вертикальный и горизонтальный компакт. Компакт это по сути просто сумма всех пикселов по горизонтали или вертикали, гистограмма.
Далее, по компактам ищутся начало матрицы и ее конец. После чего изображение обрезается по найденным границам. На этом этапе мы получаем следующее:
Преобразование картинки


3) Затем мы пробегаемся по полученному изображению и ищем черные пикселы. Поскольку баркод задан в формате DataMatrix, то матрица имеет фиксированный размер 16x16. И мы легко можем отнести каждый пиксел к ячейке искомой матрицы. Число черных пикселов заносится в соотв ячейки матрицы.

4) После того, как матрица получена, оцениваем число пикселов, попавших в каждую ячейку. Там где заполнение более 25% - считаем что эта ячейка заполнена, в противном случае - нет.

5) Формируем изображение 16x16, куда и заносим найденное решение. Окончательный результат:
Преобразование картинки


Полный исходник SkewCorrection - копия (2).zip.
3
Даценд
Модератор
Эксперт .NET
4286 / 4017 / 2661
Регистрация: 20.04.2015
Сообщений: 7,304
19.02.2016, 23:12 10
Цитата Сообщение от Storm23 Посмотреть сообщение
Поскольку изначальное изображение немного повернуто, то сразу наложить сетку не получится.
С таким небольшим наклоном получается:
0
Миниатюры
Преобразование картинки  
Даценд
Модератор
Эксперт .NET
4286 / 4017 / 2661
Регистрация: 20.04.2015
Сообщений: 7,304
19.02.2016, 23:23 11
Storm23,
А можно узнать, что за классы Compact и ImageWrapper, а то я отступы для обрезки искал, перебирая пиксели с каждой стороны.
0
Storm23
Эксперт .NETАвтор FAQ
6569 / 3981 / 1448
Регистрация: 11.01.2015
Сообщений: 5,151
Записей в блоге: 32
19.02.2016, 23:31 12
Цитата Сообщение от Даценд Посмотреть сообщение
А можно узнать, что за классы Compact и ImageWrapper, а то я отступы для обрезки искал, перебирая пиксели с каждой стороны.
Это мои классы из исходника ссылку на который я давал.
Цитата Сообщение от Даценд Посмотреть сообщение
С таким небольшим наклоном получается
Ну наклон может быть больше. Ведь это снимают камерой с рук или что то в этом роде. Нельзя же полностью игнорировать тот факт, что изображение наклонено, если мы делаем серьезное приложение.
1
Даценд
Модератор
Эксперт .NET
4286 / 4017 / 2661
Регистрация: 20.04.2015
Сообщений: 7,304
19.02.2016, 23:55 13
Цитата Сообщение от Storm23 Посмотреть сообщение
Нельзя же полностью игнорировать тот факт, что изображение наклонено, если мы делаем серьезное приложение.
Согласен. Просто не посчитал это серьезным приложением.

Не по теме:

Хотя сумма серьезная была изначально озвучена :)



Исправлюсь.
Еще вопрос. Я тоже на 25% остановился при проверке. Вы 25% процентов черных пикселов как достаточное их количество экспериментально получили? Или есть какая теория?
И еще вопрос. У меня при проверке "на черноту" чисто черных пикселов было немного, пришлось такое условие применять:
if (pix.R < 10 && pix.G < 10 && pix.B < 10). У Вас вижу проверку if(wr[p].G < 127). Это равнозначно или здесь свойство G не составляющая цвета, т.е. не тоже самое, что pix.G в моем условии?
0
Storm23
Эксперт .NETАвтор FAQ
6569 / 3981 / 1448
Регистрация: 11.01.2015
Сообщений: 5,151
Записей в блоге: 32
20.02.2016, 00:06 14
Цитата Сообщение от Даценд Посмотреть сообщение
Еще вопрос. Я тоже на 25% остановился при проверке. Вы 25% процентов черных пикселов как достаточное их количество экспериментально получили? Или есть какая теория?
Нет, просто от фонаря взял.
Цитата Сообщение от Даценд Посмотреть сообщение
И еще вопрос. У меня при проверке "на черноту" чисто черных пикселов было немного, пришлось такое условие применять:
if (pix.R < 10 && pix.G < 10 && pix.B < 10). У Вас вижу проверку if(wr[p].G < 127). Это равнозначно или здесь свойство G не составляющая цвета, т.е. не тоже самое, что pix.G в моем условии?
Здесь G это то же самое что и G у вас, то есть зеленый канал. Почему я проверяю только G? Ну во-первых у автора изображение уже в градациях серого, поэтому отдельные каналы нет смысла проверять.
Во-вторых, человеческий глаз более всего чувствителен к зеленому цвету (более 70% яркости приходится на зеленый канал). Поэтому если требуется быстрое преобразование в серый цвет, то вместо стандартной формулы, можно брать просто зеленый канал. Намного быстрее, с практически тем же результатом.
1
20.02.2016, 00:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2016, 00:06

Преобразование object
Привет всем! Вопрос возможно довольно глупый но пока не понял как решить: Если...

Преобразование типов
Ошибку я вставила в виде комментария public partial class WritingForm :...

Преобразование функции
Подскажите как быть. Пользователь вводит в окошко функцию, специального...


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

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

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