Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
Лунев
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 58
#1

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

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

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

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

Класс Bitmap, преобразование размеров картинки с picturebox - C#
мне нужна помощь тоесть небольшая потсказка Bitmap img = new Bitmap(picture.Image); Color c; int x = e.X;...

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

.NET 4.x Преобразование чисел. - C#
ребята, я написал программу, она читает hex файл, открывает, преобразовывает и печатает содержимое hex файла, только печатает в виде...

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

Преобразование координат - C#
Здравствуйте! Я столкнулся с проблемой: у меня есть координаты некоторых точек PointF (например, (5126489,12; 2458987,36)). Нужно...

13
Sanya_sa
Модератор
683 / 673 / 174
Регистрация: 03.02.2015
Сообщений: 4,198
Записей в блоге: 8
Завершенные тесты: 3
18.02.2016, 13:59 #2
1) Наложить сетку и посчитать значение цветности пикселей в каждой ячейке.
2) Построить (нарисовать) то что получилось
0
Лунев
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 58
18.02.2016, 14:03  [ТС] #3
а как ее наложить сетку
0
Sanya_sa
Модератор
683 / 673 / 174
Регистрация: 03.02.2015
Сообщений: 4,198
Записей в блоге: 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 / 0
Регистрация: 28.02.2014
Сообщений: 58
18.02.2016, 14:15  [ТС] #5
Ужас я тупой я сдаюсь
если алгоритм не сложный напишите пожалуйста
0
Sanya_sa
Модератор
683 / 673 / 174
Регистрация: 03.02.2015
Сообщений: 4,198
Записей в блоге: 8
Завершенные тесты: 3
18.02.2016, 14:17 #6
Цитата Сообщение от Лунев Посмотреть сообщение
напишите пожалуйста
Я же его написал ))
0
Лунев
0 / 0 / 0
Регистрация: 28.02.2014
Сообщений: 58
18.02.2016, 14:18  [ТС] #7
нет вы не поняли что бы рисовал(восстанавливал,дорисовывал....) я в край тупой
вот вижу код а применить не могу
0
Storm23
18.02.2016, 15:27
  #8

Не по теме:

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

0
Storm23
Эксперт .NETАвтор FAQ
5728 / 3463 / 1056
Регистрация: 11.01.2015
Сообщений: 4,587
Записей в блоге: 31
19.02.2016, 22:39 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Лунев, ну раз миллион никто не дал, рассказываю даром (точнее под 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
4039 / 3878 / 1954
Регистрация: 20.04.2015
Сообщений: 7,045
19.02.2016, 23:12 #10
Цитата Сообщение от Storm23 Посмотреть сообщение
Поскольку изначальное изображение немного повернуто, то сразу наложить сетку не получится.
С таким небольшим наклоном получается:
0
Миниатюры
Преобразование картинки  
Даценд
Модератор
Эксперт .NET
4039 / 3878 / 1954
Регистрация: 20.04.2015
Сообщений: 7,045
19.02.2016, 23:23 #11
Storm23,
А можно узнать, что за классы Compact и ImageWrapper, а то я отступы для обрезки искал, перебирая пиксели с каждой стороны.
0
Storm23
Эксперт .NETАвтор FAQ
5728 / 3463 / 1056
Регистрация: 11.01.2015
Сообщений: 4,587
Записей в блоге: 31
19.02.2016, 23:31 #12
Цитата Сообщение от Даценд Посмотреть сообщение
А можно узнать, что за классы Compact и ImageWrapper, а то я отступы для обрезки искал, перебирая пиксели с каждой стороны.
Это мои классы из исходника ссылку на который я давал.
Цитата Сообщение от Даценд Посмотреть сообщение
С таким небольшим наклоном получается
Ну наклон может быть больше. Ведь это снимают камерой с рук или что то в этом роде. Нельзя же полностью игнорировать тот факт, что изображение наклонено, если мы делаем серьезное приложение.
1
Даценд
Модератор
Эксперт .NET
4039 / 3878 / 1954
Регистрация: 20.04.2015
Сообщений: 7,045
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
5728 / 3463 / 1056
Регистрация: 11.01.2015
Сообщений: 4,587
Записей в блоге: 31
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
Привет! Вот еще темы с ответами:

Преобразование кода - C#
Переведите пожалуйста код из консоли в Windows Forms class Program { static void Main(string args) { ...

.NET 4.x Преобразование строк - C#
Добрый день. Есть задача со строками. Строка допустим начинается с символа @ и есть строка которая начинается с цифры. Мне нужно если...

Преобразование функции - C#
Подскажите как быть. Пользователь вводит в окошко функцию, специального формата используя х, ^,*,/,+,-, мне нужно преобразовать данные ...

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


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

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

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