Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
1 / 1 / 2
Регистрация: 25.02.2014
Сообщений: 120

SetPixel не поддерживается для изображений, имеющих форматы с индексированными точками

26.04.2015, 20:16. Показов 6032. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выделяю прямоугольную область на цветной картинке 1.Требуется вывести одновременно выделенный черно-белый(бинаризированный) график с выделенными пиками с помощью красных кружков . Но после бинаризации изображение переводится в пиксельный формат,сразу вылетает ошибка SetPixel не поддерживается для изображений, имеющих форматы с индексированными точками. Выдаёт просто выделенный цветной кусок изображения с красными кружками. Как совместить два метода?



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
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
private void CaptureRectangle()
        {   
// получаю координаты выделенного фрагмента
            var x1 = Math.Min(DrawRectangle_Mouse_X_End, DrawRectangle_Mouse_X_Start);
            var x2 = Math.Max(DrawRectangle_Mouse_X_End, DrawRectangle_Mouse_X_Start);
            var y1 = Math.Min(DrawRectangle_Mouse_Y_End, DrawRectangle_Mouse_Y_Start);
            var y2 = Math.Max(DrawRectangle_Mouse_Y_End, DrawRectangle_Mouse_Y_Start);
 
            var w = x2 - x1;
            var h = y2 - y1;
 
            if (w <= 0 || h <= 0)
                return;
 
// на форме pictureBox1,где загружается основное изображение и  pbResult для вывода результата
 
            var img = pictureBox1.Image;
 
  //создаю фрагмент для бинаризации          
            var fragment = new Bitmap(w, h);
            fragment.SetResolution(img.HorizontalResolution, img.VerticalResolution);
            using (var gr = Graphics.FromImage(fragment))
                gr.DrawImageUnscaled(img, new Point(-x1, -y1));
 
            var param1 = tb1.Value;
            var method = cbType.SelectedIndex;
 
//вывожу бинаризированную область
//Функция GraphExtractor бинаризирует картинку
            pbResult.Image = new GraphExtractor().Extract(fragment, method == 0 ? MethodType.AdaptiveThreshold : MethodType.Canny, param1);
 
            // список точек в которые будем помещать найденные максимумы
            List<Point> maxPoints = new List<Point>();
 
            Bitmap Bmp = new Bitmap(fragment); //Основное изображение.
            int bmpWidth = Bmp.Width;
            int bmpHeight = Bmp.Height;
 
            Bitmap Temp = new Bitmap(bmpWidth, bmpHeight); //Чистое изображение.
            Color[,] ALL = new Color[bmpWidth - 1, bmpHeight - 1]; //Массив для цветов пикселей.
            for (int i = 0; i < (bmpWidth - 1); i++)
            {
                for (int j = 0; j < (bmpHeight - 1); j++)
                {
                    ALL[i, j] = Bmp.GetPixel(i, j); //Получаем все цвета в массив.
                    Temp.SetPixel(i, j, ALL[i, j]); //Красим все пиксели по порядку в Темп.
                }
            }
 
//проверяем массивом,если находим НЕ белый цвет,запоминаем сразу и загоняем в массив максимумов
            for (int j = 0; j < ALL.GetLength(1); j++)
            {
                bool maximumFound = false;
 
                for (int i = ALL.GetLength(0) - 1; i >= 0; i--)
                {
                    if (ALL[i, j] != Color.FromArgb(255, 255, 255))
                    {
                        maximumFound = true;
                        maxPoints.Add(new Point(i, j));
 
 
 
                        i -= 15; // пропускаем 10 пикселей, из за толщины линии
                    }
 
                }
 
                if (maximumFound) break;
 
            }
 
            Graphics lin = Graphics.FromImage(Temp);
            foreach (var item in maxPoints)
                lin.DrawEllipse(new Pen(Color.Red), item.X - 5, item.Y - 5, 10, 10);
 
//выводим максимумы
 
            pbResult.Image = Temp;
        }


вот метод GraphExtractor где бинаризируется картинка,может я неправильно конвертирую из пиксельного формата в Bitmap?
вроде прописал правильно
C#
1
2
 return gray2.ToBitmap();
  return canny.ToBitmap();
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
public class GraphExtractor
    {
        public Bitmap Extract(Image image, MethodType method = MethodType.AdaptiveThreshold, float param = 25f)
        {
              
            using(var img = new Image<Bgr, byte>((Bitmap)image))
            using(var gray = img.Convert<Gray, Byte>())//gray
            using (var gray2 = gray.PyrDown().PyrUp())//smoothed
            {
                //Canny method
                if (method == MethodType.Canny)
                {
                    Image<Gray, byte> canny = gray2.Canny(new Gray(param), new Gray(param));
                    return canny.ToBitmap();
 
                }
 
                //AdaptiveThreshold method
                if (method == MethodType.AdaptiveThreshold)
                {
                    CvInvoke.cvAdaptiveThreshold(gray2, gray2, 255,
                                                 Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C,
                                                 Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, 3, param/10f);
                    gray2._ThresholdBinary(new Gray(150), new Gray(255));
 
                    //gray2._Erode(1);
                    //gray2._Dilate(1);
 
                    return gray2.ToBitmap();
                }
 
              
 
                return null;
 
 
            }
        }
    }
Миниатюры
SetPixel не поддерживается для изображений, имеющих форматы с индексированными точками  
Изображения
 
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.04.2015, 20:16
Ответы с готовыми решениями:

Метод дихотомии для уравнения с индексированными переменными
Привет, ребята!:) В свое время использовала несложную программу в Маткаде для своих нужд. И вот теперь решила, что надо бы попробовать...

Ввод даты вида хх.хх.хххх и её преобразоватие в другие форматы форматы. String
пользователь вводит дату рождения вида хх.хх.хххх, написать программу, которая выводит эту дату в форматах (напр. 21.10.2013): 1....

Среднее время ожидания на рейде отдельно для судов, имеющих и не имеющих приоритета в обслуживании
Здравствуйте! Задача. В морском порту имеются 2 причала: старый и новый. У старого причала одновременно могут швартоваться 2 судна....

5
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
26.04.2015, 21:14
Цитата Сообщение от Злой_дед Посмотреть сообщение
может я неправильно конвертирую из пиксельного формата в Bitmap?
вроде прописал правильно
Вероятно, эти методы возвращют Bitmap c PixelFormat = Indexed. Надо как-то перевести в обычный или научиться задавать цвет иначе. Не знаю как.
1
1 / 1 / 2
Регистрация: 25.02.2014
Сообщений: 120
26.04.2015, 21:36  [ТС]
У вас с английским лучше,я уверен что в той же самой библиотеке EmguCV есть функция,которая переводит из пиксельного формата в обычный Image.Поможете найти?

http://www.emgu.com/wiki/files... 26f1da.htm

http://www.emgu.com/wiki/files... 21dfb8.htm
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
26.04.2015, 21:50
попробуй использовать свойство Bitmap вместо метода ToBitmap
Ну а вообще, насколько я понял, проблема в том, что цвета в конечном изображении задаются не напрямую, а через палитру (Palette).
1
1 / 1 / 2
Регистрация: 25.02.2014
Сообщений: 120
27.04.2015, 10:34  [ТС]
Ну да, тут как раз код с палитрой присутствует.https://msdn.microsoft.com/en-... .110).aspx

Здесь говорится о переводе в ToImage(); с помощью EmguCV.
http://stackoverflow.com/quest... stem-image
но в коде пишет ToBitmap();
C#
1
2
3
4
5
// create an Emgu image of 400x200 filled with Blue color
Image<Bgr, Byte> img = new Image<Bgr, byte>(400, 200, new Bgr(255, 0, 0));
 
// copy to a .NET image
System.Drawing.Image pMyImage = img.ToBitmap();
Добавлено через 1 час 47 минут
Если не получается конвертировать пиксельный вид картинки,то можно обойти это всё,сделав метод не автоматизированным.Можно попытаться сохранить на компьютер выделенный бинаризированный фрагмент,загрузить его как картинку снова,только в другое окошко(новое),picturebox с параметрами Normal,затем получить пиксели,перекрасить с отрисовкой выделенных максимумов,отрисовать сетку,используя ваш код,сетка отрисуется как раз под масштаб,тока доработать придётся чутка.Рисунок получится у нас уже как отдельный объект. Сохранить хоть возможно так? в формат jpeg,png,bmp?

Добавлено через 10 часов 39 минут
0
1 / 1 / 2
Регистрация: 25.02.2014
Сообщений: 120
03.05.2015, 12:09  [ТС]
а как сделать функцию к вашей сетке?
Вычислить количество квадратов отрисованной сетки между отрисованными пиками
квадраты считать не получится наверное,только если линии считать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2015, 12:09
Помогаю со студенческими работами здесь

Аналоги для GetPixel/SetPixel
Есть такой код: var bmp = pictureBox1.Image as Bitmap; for (int i = 0; i &lt; bmp.Width; i++) { ...

Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей.
Добрый ночь! Возникла такая проблема. Вот код. SqlConnectionStringBuilder bu = new SqlConnectionStringBuilder(); SqlDataAdapter...

Форматы объявлений для блогов?
Какие форматы объявлений на ваш взгляд наиболее удачно использовать для блогов? Где их оптимально располагать? PS Интересует ваше...

Форматы видео для DVD-плееров
Дело в том, что мне необходимо записать диск, который бы читал DVD-плеер Samsung P 650K. Этот плеер читает MPEG-4 (Dvix). Если DVD-плеер...

Форматы выгрузки из 1С для Банк-клиент
Кто нибудь знает где можно достать формат выгрузки платежек из 1С в TXT?


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru