Перебор пикселей на изображениях занимает очень много времени - 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;
}