EMGU использует структуру, встроенную в C #, для хранения данных изображения. Это позволяет коду работать более эффективно, чем использовать OpenCV для всего. Хотя EMGU оборачивает некоторые функции OpenCV в неуправляемый код, поэтому мы добавляем opencv.dll, но также пытаемся сохранить как можно больше функций в c #.
EMGU Image Structure получает данные изображения немного по-другому, используя метод GetPixel, выглядит следующим образом:
//Colour Image
Bgr my_Bgr = My_Image[0, 0];
//Gray Image
Gray my_Gray = gray_image[0, 0];
Там, где вы явно меняете [0,0] на соответствующее место на вашем изображении. В EMGU это не рекомендуется, поскольку, хотя он не такой медленный, как метод Bitmap.GetPixel, он все же не самый быстрый метод.
EMGU Структура изображения имеет прямой доступ к матрице изображения в свойстве Image.Data. Это намного быстрее при чтении / записи данных. Однако, небольшое предупреждение, что любой метод значительно замедляется при циклическом прохождении каждого пикселя, когда установлена ROI изображения. Гораздо проще вручную задать для операторов начала и окончания цикла требуемую настройку ROI, а затем установить поле ROI. Причина в том, что любой метод должен сначала проверить ROI, а затем вычислить пиксель, к которому осуществляется доступ, прежде чем найти данные, и это добавляет пару инструкций.
Доступ к методу Image.Data можно получить следующим образом:
//Image<Bgr,Byte>: Bgr = Blue,Green,Red
int Red = My_Image.Data[0,0,2]; //Read to the Red Spectrum
int Green= My_Image.Data[0,0,1]; //Read to the Green Spectrum
int Blue= My_Image.Data[0,0,0]; //Read to the BlueSpectrum
В любом случае ваш код должен выглядеть примерно так:
for (int filterX = 0; filterX < filterWidth; filterX++)
{
for (int filterY = 0; filterY < filterHeight; filterY++)
{
int imageX = (x - filterWidth / 2 + filterX + w) % w;
int imageY = (y - filterHeight / 2 + filterY + h) % h;
red += img.Data[imageY,imageX,2] * filter[filterX, filterY];
green += img.Data[imageY,imageX,1] * filter[filterX, filterY];
blue += img.Data[imageY,imageX,0] * filter[filterX, filterY];
}
int r = Math.Min(Math.Max((int)(factor * red + bias), 0), 255);
int g = Math.Min(Math.Max((int)(factor * green + bias), 0), 255);
int b = Math.Min(Math.Max((int)(factor * blue + bias), 0), 255);
result[x, y] = Color.FromArgb(r, g, b);
}
Если вам нужна дополнительная помощь, я немного подробнее расскажу о доступе к данным изображения в своей статье проекта кода Создание вашего первого проекта обработки изображений EMGU ,
Надеюсь, это поможет,
Приветствия
Chris