Как вычесть одно растровое изображение из другого в C # / .NET?

StackOverflow https://stackoverflow.com/questions/397759

  •  29-08-2019
  •  | 
  •  

Вопрос

У меня есть два растровых изображения, созданных различными вариациями алгоритма.Я бы хотел создать третье растровое изображение, вычитая одно из другого, чтобы показать различия.

Как это можно сделать в .NET?Я просмотрел класс Graphics и все его опции, включая класс ImageAttributes, и у меня есть подозрение, что он включает в себя функциональность цветовой матрицы или таблиц переназначения.

У кого-нибудь есть ссылка на какой-нибудь пример кода или он может указать мне правильное направление?Поиск в Google мало что дает, если только мой google-fu не подводит меня сегодня.

Это было полезно?

Решение

Реальный вопрос в том, какие различия вы хотите показать?Если вам просто нужно оперировать значениями цвета RGB, то, на мой взгляд, лучше всего просто просмотреть оба растровых изображения и сравнить значения цвета с помощью GetPixel, а затем использовать SetPixel для создания вашего растрового изображения "разница".Возможно, вы просто хотите вычесть значения и использовать их в качестве нового значения цвета для третьего растрового изображения.Или, возможно, вы хотите рассчитать яркость и использовать это.Еще лучше, если у вас есть три показателя для сравнения, присвоите каждый из них компонентам Rg и B цвета.Я уже использовал этот подход для фрактальной раскрашивания раньше.

Есть и другие подходы, но с этим вы ограничены только своим воображением.Возможно, это не самый быстрый подход, но не похоже, что производительность необходима для данного сценария.

Другие советы

Посмотрите на этот проект.Это детектор движения, изготовленный Андреем Кирилловым.Он реализует пару фильтров, чтобы получить различия между двумя изображениями, и использует это для вычисления движений.Это действительно красиво сделано, и его легко модифицировать и использовать в вашем собственном приложении.

http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx

Это можно сделать, закрепив БитБлт Функция API.Вот несколько примеров кода:

http://www.codeproject.com/KB/GDI-plus/Bitblt_wrapper_class.aspx

В примере используется код растровой операции SRCCOPY;чтобы получить различия между двумя растровыми изображениями, вы бы вместо этого захотели использовать SRCPAINT или что-то в этом роде (GOOGLE должен предоставить список кодов).

GetPixel и SetPixel (в классе Bitmap) работают невероятно медленно.Использование LockBits будет намного быстрее, но вам все равно придется написать свой собственный код.

Обновить:это лучшая ссылка:

http://www.pinvoke.net/default.aspx/gdi32.BitBlt

и включает в себя все возможные операции с троичным растром (SRCPAINT или SRCAND, вероятно, то, что вы ищете.).

Сначала определите subtract ;-p Как вы хотите, чтобы выглядел ответ?

Вероятно, наиболее производительный способ сделать это LockBits - это должно быть намного быстрее, чем множество GetPixel вызовы, но вам нужно будет самостоятельно декодировать байты.Легко, если это просто что-то вроде 32bpp ARGB, но сложно для некоторых более сложных случаев.

Я где-то читал, что язык, используемый в Adobe Pixel Бендер вдохновлен чем-то, что когда-то сделала Microsoft.Не помню, где я это прочитал.Я думаю, что, возможно, это "что-то" Microsoft обернуто во что-то, что может использовать проект .Net.Перебор для простого вычитания двух изображений, но в любом случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top