Перебор пикселей на изображениях занимает очень много времени - C#

Узнай цену своей работы

Формулировка задачи:

Программа получает на вход два изображения(300х300 и 50х50).Также создаю полностью черное изображение размерами 300х300 Дальше идет сравнение каждого пикселя одного изображения со всеми пикселями другого. Пиксели извлекаю GetPixel(...).Если пикселя совпадают, то пиксель на третьем изображении с координатами совпавшего пикселя на первом изображении делаю белым(SetPixel).Далее идут операции обработки, но это не суть важно. Важно то,что вся эта операция занимает 7 минут. Надо срочно что-нибудь подправить. Вот часть кода:
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);
                            
                            ;
                        } 
                }
label1 и label3 содержать путь к изображениямю Суть всей программы в поиске объекта,изображенном на 2 рисунке(так называемый образец), на 1 изображении. В данной части программы мы находим совпадения цветов( я условился, что на изображениях отсутствуют тени и шумы) Собственно, в чем просьба к вам: 1)Как можно ускорить поиск.7 минут-не дело 2)Может, можно добавить условие, которое как раз позволит ускорить алгоритм. Буду очень благодарен за ответ. PS.Еще благодарнее буду, если кто сможет мне помочь через icq -592803800

Решение задачи: «Перебор пикселей на изображениях занимает очень много времени»

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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы