Обработка изображений C # - PullRequest
3 голосов
/ 15 февраля 2012

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

bool r = true;
Color checkColor = image.GetPixel(0, 0);

for (int x = 0; x < image.Width; x++)
  {
   for (int y = 0; y < image.Height; y++)
     {
      if (image.GetPixel(x, y) != checkColor) { r = false; }
     }
   }
// image color
clrOut = checkColor;
return r;

Но этот алгоритм работает медленно для больших изображений.Кто-нибудь знает способ сделать это с помощью Pixel Shaders и GPU?

Ответы [ 4 ]

6 голосов
/ 15 февраля 2012

Вам не нужны пиксельные шейдеры и графический процессор, чтобы ускорить это. Используйте LockBits . У Боба Пауэлла есть хороший учебник о том, как делать то, что вы хотите.

2 голосов
/ 27 февраля 2012

Также, глядя на ваш код, попробуйте поменять местами циклы for, это даст лучший доступ к памяти

for (y ... ... for (x ...

). Следующий шагчтобы развернуть доступ к некоторым пикселям. Попробуйте выбрать 4 или 8 пикселей в цикле интервала

для (y ... ... для (x = 0; x

  pixel0 = image.getpixel(x,Y)
  pixel1 = image.getpixel(x +1,Y)
  pixel2 = image.getpixel(x +2,Y)
  pixel3 = image.getpixel(x +3,Y)

  if ( pixel0 ....

Как указывалось ранее, использование Bitmap Unlock позволяет получать доступ к пикселям с помощью указателей, что является самым быстрым из всех, которые вы можете получить на ЦП. Вы также можете применять упорядочение циклов и развертывание пикселей к этой технике.
Еслиэто не достаточно быстро, тогда есть выбор между: многопоточность C # или GPU с OpenCL и его привязкой C #.

1 голос
/ 15 февраля 2012

Этот код медленный, потому что вы используете GetPixel.Вы можете сделать это намного быстрее, используя прямой доступ к указателю.Только если этого недостаточно, я бы посмотрел на пиксельные шейдеры.

Я написал несколько вспомогательных библиотек: https://github.com/CodesInChaos/ChaosUtil/tree/master/Chaos.Image

В частности, типы Pixels и RawColor должныбыть полезным.

0 голосов
/ 15 февраля 2012

Если вы ищете только изображение с большими вариационными областями по сравнению с изображением того же цвета, вы можете уменьшить его до 1x1 пикселя, используя билинейную фильтрацию, и прочитать пиксел 0,0. Если пиксель ОЧЕНЬ отличается от того, что вы ожидаете (расстояние RGB в зависимости от допуска), вы можете быть уверены, что в исходном изображении были некоторые различия.

Конечно, это зависит от того, что вы действительно хотите сделать с этой информацией, поэтому YMMV.

...