Я пытаюсь перенести некоторый код из старого проекта Python в текущий проект C # .
Код Python, который я пытаюсь адаптировать, применяет фильтр sobel к каждому из цветовых каналов RGB в изображении, а затем использует некоторую базовую линейную алгебру для сшивания результатов канала. вместе в градациях серого изображение изолированных краев.
Проблема, с которой я сталкиваюсь, заключается в том, что в то время как python позволяет легко обрабатывать изображения как простые числовые массивы, и, таким образом, можно произвольно брать их фрагменты и выполнять над ними операции линейной алгебры ( C # более привередлив в отношении набора текста).
Мне нужно сделать матричное умножение результатов, которые я получаю при запуске фильтра sobel на отдельных каналах изображения, но неясно, как втиснуть растровое изображение в форму, которая легко это допустит.
Я видел кое-что о преобразовании в byte
массив , но не уверен, что это подойдет для моих целей. Я бы просто хотел обычный int или float
массив , содержащий значения пикселей.
Я мог бы проходить по пикселям и выполнять побитовые операции с ними, но это должно замедлить процесс, поэтому мне было интересно, есть ли хороший способ выполнить matrix операции над растровым изображением или преобразование растрового изображения в форму, которая будет подпадает под это.
Я не уверен точно, насколько это было бы полезно, но если это поможет проиллюстрировать то, о чем я говорю, вот мой код на python:
image_array = numpy.float64(scaled_image)
R_x = scipy.ndimage.filters.correlate(image_array[:, :, 0], [[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
G_x = scipy.ndimage.filters.correlate(image_array[:, :, 1], [[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
B_x = scipy.ndimage.filters.correlate(image_array[:, :, 2], [[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
R_y = scipy.ndimage.filters.correlate(image_array[:, :, 0], [[1, 0 , -1], [2, 0, -2], [1, 0, -1]])
G_y = scipy.ndimage.filters.correlate(image_array[:, :, 1], [[1, 0 , -1], [2, 0, -2], [1, 0, -1]])
B_y = scipy.ndimage.filters.correlate(image_array[:, :, 2], [[1, 0 , -1], [2, 0, -2], [1, 0, -1]])
Jacobian_x = R_x**2 + G_x**2 + B_x**2
Jacobian_y = R_y**2 + G_y**2 + B_y**2
Jacobian_xy = R_x * R_y + G_x * G_y + B_x * B_y
D = numpy.sqrt(numpy.fabs((Jacobian_x**2) - (2 * Jacobian_x * Jacobian_y) + (Jacobian_y**2) + 4 * (Jacobian_xy**2)))
E = (Jacobian_x + Jacobian_y + D) / 2
Edges = numpy.sqrt(E)
И где я до сих пор с эквивалентным кодом C #:
Bitmap newImage = resize.Apply(bmp);
Bitmap RedImage = extractRed.Apply(newImage);
Bitmap GreenImage = extractGreen.Apply(newImage);
Bitmap BlueImage = extractBlue.Apply(newImage);
Bitmap Rx = SobelX.Apply(RedImage);
Bitmap Gx = SobelX.Apply(GreenImage);
Bitmap Bx = SobelX.Apply(BlueImage);
Bitmap Ry = SobelY.Apply(RedImage);
Bitmap Gy = SobelY.Apply(GreenImage);
Bitmap By = SobelY.Apply(BlueImage);
***Where all my math would go.
Jacobian_x = yadda yadda yadda***
Заранее спасибо всем, кто может помочь!