Перебор пикселей на изображениях занимает очень много времени - C#
Формулировка задачи:
Программа получает на вход два изображения(300х300 и 50х50).Также создаю полностью черное изображение размерами 300х300
Дальше идет сравнение каждого пикселя одного изображения со всеми пикселями другого.
Пиксели извлекаю GetPixel(...).Если пикселя совпадают, то пиксель на третьем изображении с координатами совпавшего пикселя на первом изображении делаю белым(SetPixel).Далее идут операции обработки, но это не суть важно.
Важно то,что вся эта операция занимает 7 минут. Надо срочно что-нибудь подправить.
Вот часть кода:
label1 и label3 содержать путь к изображениямю
Суть всей программы в поиске объекта,изображенном на 2 рисунке(так называемый образец), на 1 изображении. В данной части программы мы находим совпадения цветов( я условился, что на изображениях отсутствуют тени и шумы)
Собственно, в чем просьба к вам:
1)Как можно ускорить поиск.7 минут-не дело
2)Может, можно добавить условие, которое как раз позволит ускорить алгоритм.
Буду очень благодарен за ответ.
PS.Еще благодарнее буду, если кто сможет мне помочь через icq -592803800
Bitmap one = new Bitmap(@label1.Text); Bitmap two = new Bitmap(@label3.Text); Bitmap thr = new Bitmap(@label1.Text); for (int h = 0; h <= thr.Height-1; h++) for (int g = 0; g <= thr.Width-1; g++) thr.SetPixel(g, h, Color.Black); for (int q = 0; q <= one.Width-two.Width-1; q++) for (int z = 0; z <= one.Height - two.Height - 1; z++) { for (int f = 0; f <= two.Width - 1; f++) for (int s = 0; s <= two.Height - 1; s++) { if (one.GetPixel(q, z) == two.GetPixel(f, s)) thr.SetPixel(q, z, Color.White); ; } }
Решение задачи: «Перебор пикселей на изображениях занимает очень много времени»
textual
Листинг программы
//Получение указателя на определенный пиксель в первом изображении и накладывание на него структуры для более удобного доступа к отдельным ячейкам памяти Pixel* pxOne = (Pixel*)( (byte*)oneBits.Scan0 + i * sizeof(Pixel) ); // Получение указателя на первый байт первого пикселя второго изображения byte* ptr = (byte*)twoBits.Scan0; for (int j = 0; j < height; j++) { for (int k = 0; k < width; k++) { // Накладывание структуры на указатель Pixel* pxTwo = (Pixel*)ptr; // Проверка на равенство значений пикселей первого и второго изображения if (pxOne->Equals(*pxTwo)) { // Получение указателя на пиксель третьего изображения, находящийся в тех же "координатах", что и рассматриваемый пиксель на первом изображении Pixel* pxThr = (Pixel*)( (byte*)thrBits.Scan0 + i * sizeof(Pixel) ); // Присваивание числа 255 всем значениям (пиксель стает белым). pxThr->Alpha = pxThr->Red = pxThr->Green = pxThr->Blue = 0xFF; } // Увеличение значения указателя на размер пикселя. // Фактически, "переход" к адресу следующего пикселя в изображении ptr += sizeof(Pixel); } // Пропуск "лишних" байт, если таковые имеются. ptr += padding; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д