Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/65: Рейтинг темы: голосов - 65, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 06.03.2018
Сообщений: 50

Фильтр Собеля (нужно реализовать данное условие)

23.03.2018, 11:38. Показов 13304. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вместо этого кода должно быть поэлементное умножение матриц sx и полученной из неё sy на окрестность точки (x, y)
Такая операция ещё называется свёрткой (Сonvolution)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 var gx = -g[x - 1, y - 1] - 2 * g[x, y - 1] - g[x + 1, y - 1] + g[x - 1, y + 1] + 2 * g[x, y + 1] + g[x + 1, y + 1];
                    var gy = -g[x - 1, y - 1] - 2 * g[x - 1, y] - g[x - 1, y + 1] + g[x + 1, y - 1] + 2 * g[x + 1, y] + g[x + 1, y + 1];
                    result[x, y] = Math.Sqrt(gx * gx + gy * gy);
 
[size="1"][color="grey"][I]Добавлено через 18 минут[/I][/color][/size]
using System;
 
namespace Recognizer
{
    internal static class SobelFilterTask
    {
        /* 
        Разберитесь, как работает нижеследующий код (называемый фильтрацией Собеля), 
        и какое отношение к нему имеют эти матрицы:
        
             | -1 -2 -1 |           | -1  0  1 |
        Sx = |  0  0  0 |      Sy = | -2  0  2 |
             |  1  2  1 |           | -1  0  1 |
        
        [url]https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%A1%D0%BE%D0%B1%D0%B5%D0%BB%D1%8F[/url]
        
        Попробуйте заменить фильтр Собеля 3x3 на фильтр Собеля 5x5 или другой аналогичный фильтр и сравните результаты. 
        Матрицу для фильтра Собеля 5x5 и другие матрицы можно посмотреть в статье SobelScharrGradients5x5.pdf в архиве с проектом.
        Там Sx и Sy названы соответственно β и γ.
 
        Обобщите код применения фильтра так, чтобы можно было передавать ему любые матрицы, любого нечетного размера.
        Фильтры Собеля размеров 3 и 5 должны быть частным случаем. 
        После такого обобщения менять фильтр Собеля одного размера на другой должно быть легко.
        */
 
        public static double[,] SobelFilter(double[,] g, double[,] sx)
        {
            var width = g.GetLength(0);
            var height = g.GetLength(1);
            var result = new double[width, height];
            for (int x = 1; x < width - 1; x++)
                for (int y = 1; y < height - 1; y++)
                {
                    // Вместо этого кода должно быть поэлементное умножение матриц sx и полученной из неё sy на окрестность точки (x, y)
                    // Такая операция ещё называется свёрткой (Сonvolution)
                    var gx = -g[x - 1, y - 1] - 2 * g[x, y - 1] - g[x + 1, y - 1] + g[x - 1, y + 1] + 2 * g[x, y + 1] + g[x + 1, y + 1];
                    var gy = -g[x - 1, y - 1] - 2 * g[x - 1, y] - g[x - 1, y + 1] + g[x + 1, y - 1] + 2 * g[x + 1, y] + g[x + 1, y + 1];
                    result[x, y] = Math.Sqrt(gx * gx + gy * gy);
                }
            return result;
        }
    }
}

Вот что было дано
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2018, 11:38
Ответы с готовыми решениями:

Фильтр Собеля. Перенос из C++
Решила попробовать фильтр Собеля. Нашла код на С++, попыталась переделать его на C#, но немного не получается. Подскажите пожалуйста как...

Фильтр Собеля в Delphi из С++
Уважаемые форумчане, нужно создать программу для выделения краев изображения.За основу взял алгоритм отсюда. Вот что у меня получилось: ...

нужно реализовать фильтр
я создал большой банк данных и теперь столкнулся со сложностью написания фильтра. Что мы имеем: таблица Products ...

2
134 / 130 / 107
Регистрация: 17.03.2009
Сообщений: 364
25.03.2018, 20:57
Вот код обобщенного случая. Я его не тестировал.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    public class Sobel
    {
        //Транспонирует матрицу
        public static double[,] Transpose(double[,] matr)
        {
            var n = matr.GetUpperBound(0) + 1;
            var m = matr.GetUpperBound(1) + 1;
            var result = new double[m, n];
            for (var i = 0; i < n; i++)
            {
                for (var j = 0; j < m; j++)
                {
                    result[j, i] = matr[i, j];
                }
            }
            return result;
        }
 
        //Матрица окрестности точки x,y
        public static double[,] GetNeighbourhood(double[,] g, int x, int y, int size)
        {
            var result = new double[size, size];
            var delta = size / 2;
            for (var i = x - delta; x <= y + delta; x++)
                for (var j = y - delta; y <= y + delta; y++)
                {
                    result[i - (x - delta), j - (y - delta)] = g[i, j];
                }
            return result;
        }
 
        //Произведение матриц.
        public static double Mult(double[,] sxy, double[,] neighbourhood)
        {
            var sum = 0d;
            for (var i = 0; i < neighbourhood.GetUpperBound(0) + 1; i++)
            {
 
                for (var j = 0; j < neighbourhood.GetUpperBound(0) + 1; j++)
                {
                    sum += sxy[i, j] * neighbourhood[i, j];
                }
 
            }
            return sum;
        }
 
 
        public static double[,] SobelFilter(double[,] g, double[,] sx)
        {
            var width = g.GetLength(0) + 1;
            var height = g.GetLength(1) + 1;
            var sizeX = sx.GetUpperBound(0) + 1;
            var sizeY = sx.GetUpperBound(1) + 1;
 
            if (sizeX != sizeY)
            {
                throw new ArgumentException("Матрица Sx должна быть квадратной");
            }
            if (sizeX % 2 == 0)
            {
                throw new ArgumentException("Матрица Sx должна иметь нечетную размерность");
            }
 
            var result = new double[width, height];
 
            var deltaX = sizeX / 2;
            var deltaY = sizeY / 2;
            var sy = Transpose(sx);
 
            for (int x = deltaX; x < width - deltaX; x++)
            {
                for (int y = deltaY; y < height - deltaY; y++)
                {
                    var neighbourhood = GetNeighbourhood(g, x, y, sizeX);
                    var gx = Mult(sx, neighbourhood);
                    var gy = Mult(sy, neighbourhood);
                    result[x, y] = Math.Sqrt(gx * gx + gy * gy);
                }
            }
            return result;
        }
}
1
0 / 0 / 0
Регистрация: 01.08.2021
Сообщений: 3
01.08.2021, 09:50
Были ошибки в методе GetNeighbourhood
Исправленная и протестированная версия:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
 
namespace Recognizer
{
    internal static class SobelFilterTask
    { //Транспонирует матрицу
        public static double[,] Transpose(double[,] matr)
        {
            var n = matr.GetUpperBound(0) + 1;
            var m = matr.GetUpperBound(1) + 1;
            var result = new double[m, n];
            for (var i = 0; i < n; i++)
                for (var j = 0; j < m; j++)
                    result[j, i] = matr[i, j];
            return result;
        }
        //Матрица окрестности точки x,y
        public static double[,] GetNeighbourhood(double[,] g, int x, int y, int size)
        {
            var result = new double[size, size];
            result.Initialize();
            var delta = size / 2;
            for (var i = x - delta; i <= x + delta; i++)
                for (var j = y - delta; j <= y + delta; j++)
                    result[i - (x - delta), j - (y - delta)] = g[i, j];
            return result;
        }
        //Произведение матриц.
        public static double MultiplyMatrix(double[,] sxy, double[,] neighbourhood)
        {
            var sum = 0d;
            for (var i = 0; i < neighbourhood.GetUpperBound(0) + 1; i++)
                for (var j = 0; j < neighbourhood.GetUpperBound(0) + 1; j++)
                    sum += sxy[i, j] * neighbourhood[i, j];
            return sum;
        }
 
        public static double[,] SobelFilter(double[,] g, double[,] sx)
        {
            var width = g.GetLength(0);
            var height = g.GetLength(1);
            var result = new double[width, height];
            var sizeX = sx.GetUpperBound(0) + 1;
            var sizeY = sx.GetUpperBound(1) + 1;
            var deltaX = sizeX / 2;
            var deltaY = sizeY / 2;
            var sy = Transpose(sx);
 
            for (int x = deltaX; x < width - deltaX; x++)
            {
                for (int y = deltaY; y < height - deltaY; y++)
                {
                    var neighbourhood = GetNeighbourhood(g, x, y, sizeX);
                    var gx = MultiplyMatrix(sx, neighbourhood);
                    var gy = MultiplyMatrix(sy, neighbourhood);
                    result[x, y] = Math.Sqrt(gx * gx + gy * gy);
                }
            }
            return result;
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2021, 09:50
Помогаю со студенческими работами здесь

Что означает данное условие? if (i & (1 << j)
Можете объянить простым алгоритмическим языком что данное условие означает? if (i &amp; (1 &lt;&lt; j))

Цикл for: что означает данное условие?
рисую прямоуголник по периметру звездочки мне не понятно if (i == 0 || j == 0 || i == 10 - 1 || j == 20 - 1) почему надо приравнивать...

Что значит данное условие(словами обяснить)
Я понимаю так: если Апровд равнозначно функции с параметром Комvент И поле Комментайди больше нуля, то ... а дальше непонятно: что за...

Как можно написать данное условие в 1 строку?
как можно написать данное условие в 1 строку Если СохранитьВExcel= Ложь Тогда ЭтаФорма.Элементы.ПутьКФайлу.Доступность=Ложь ; ...

Найти элемент, для которого выполняется данное условие
Вообще задача какая то не понятная. Были бы числа а не формулы то записал бы. Помогите пожалуйста.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru