Форум программистов, компьютерный форум, киберфорум
JavaScript: HTML5 Canvas
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.07.2021
Сообщений: 1

Создание оператора Собеля

18.01.2022, 19:08. Показов 1303. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста, как я должен изменить данный код, чтобы получить оператора Собеля ? (Ниже код оператора Робертса).

JavaScript
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
  function handleRoberts() {
    var inImageData = ctxIn.getImageData(0, 0, ctxIn.canvas.width, ctxIn.canvas.height);
    var outImageData = ctxOut.getImageData(0, 0, ctxOut.canvas.width, ctxOut.canvas.height);
    var inData = inImageData.data;
    var outData = outImageData.data;
    var Dx00, Dx01, Dx10, Dx11, Gx, Gy, G;
    var W = 4 * ctxIn.canvas.width;
    var Thr = document.getElementById('threshold').value;
    document.getElementById('thresholdOut').value = Thr;
    for (var i = 0; i < inData.length; i += 4) {
      Dx00 = inData[i] + inData[i + 1] + inData[i + 2];
      Dx01 = inData[i + W] + inData[i + W + 1] + inData[i + W + 2];
      Dx10 = inData[i + 4] + inData[i + 5] + inData[i + 6];
      Dx11 = inData[i + W + 4] + inData[i + W + 5] + inData[i + W + 6];
      Gx = Dx11 - Dx00;
      Gy = Dx10 - Dx01;
      G = Math.sqrt(Gx * Gx + Gy * Gy);
      if (G < Thr) {
        outData[i]     = 255; // red
        outData[i + 1] = 255; // green
        outData[i + 2] = 255; // blue
      } else {
        outData[i]     = 0; // red
        outData[i + 1] = 0; // green
        outData[i + 2] = 0; // blue
      }
      outData[i + 3] = 255;
    }
    ctxOut.putImageData(outImageData, 0, 0);
  }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2022, 19:08
Ответы с готовыми решениями:

Qt создание окна, вывод картинки, наложение оператора Собеля
Добрый вечер. Прошу помощи. с Qt знаком поверхностно, но надо написать программу, которая будет выводить окно с картинкой, а на картинку...

Создание собственного оператора С++
Как создать собственный оператор типа if, в смысле Оператор (){ ...//Какие-то действия } Я просто хочу создать нечто наподобие...

Создание оператора с условием
Функция это первое задание, а рисунок второе.

1
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
08.02.2022, 01:56
Вот что я написал. Можно отрефакторить.
HTML5
1
2
3
4
5
6
<div id="wrapper">
  <canvas id="outSobel" width="500" height="300"></canvas>
  <canvas id="in" width="500" height="300"></canvas>
  <canvas id="outRoberts" width="500" height="300"></canvas>
</div>
<input type="file">
CSS
1
2
3
4
5
6
7
8
canvas {
  display: block;
  width: 33%;
  border: thin solid silver;
}
#wrapper {
  display: flex;
}
JavaScript
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
const canvas = document.getElementById("in"),
  canvas2 = document.getElementById("outSobel"),
  canvas3 = document.getElementById("outRoberts");
const input = document.querySelector("[type=file]");
input.onchange = function () {
  const url = URL.createObjectURL(this.files[0]),
    ctx = canvas.getContext("2d"),
    img = new Image();
  img.onload = function () {
    ctx.drawImage(
      img,
      0,
      0,
      canvas.getAttribute("width"),
      canvas.getAttribute("height")
    );
    handle_();
  };
  img.src = url;
};
function handle_() {
  const ctxIn = canvas.getContext("2d"),
    ctxOut1 = canvas2.getContext("2d"),
    ctxOut2 = canvas3.getContext("2d");
  const inImageData = ctxIn.getImageData(
    0,
    0,
    ctxIn.canvas.width,
    ctxIn.canvas.height
  );
  const outImageData1 = ctxOut1.getImageData(
      0,
      0,
      ctxOut1.canvas.width,
      ctxOut1.canvas.height
    ),
    outImageData2 = ctxOut2.getImageData(
      0,
      0,
      ctxOut2.canvas.width,
      ctxOut2.canvas.height
    );
  const inData = inImageData.data,
    outData1 = outImageData1.data,
    outData2 = outImageData2.data;
  let W = 4 * ctxIn.canvas.width;
  let Thr = 100; //
  for (let i = 0; i < inData.length; i += 4) {
    const region_2_2 = [
        [0, 1],
        [0, 1]
      ],
      region_3_3 = [
        [0, 1, 2],
        [0, 1, 2],
        [0, 1, 2]
      ];
    const pixelDataSobel = getPixelData(
        { data: inData, width: W },
        region_3_3,
        i
      ),
      pixelDataRoberts = getPixelData(
        { data: inData, width: W },
        region_2_2,
        i
      );
    const GRoberts = roberts(pixelDataRoberts),
      GSobel = sobel(pixelDataSobel);
    const color1 = GSobel < Thr ? 255 : 0,
      color2 = GRoberts < Thr ? 255 : 0;
    [outData1[i], outData1[i + 1], outData1[i + 2]] = [color1, color1, color1];
    outData1[i + 3] = 255;
    [outData2[i], outData2[i + 1], outData2[i + 2]] = [color2, color2, color2];
 
    outData2[i + 3] = 255;
  }
  ctxOut1.putImageData(outImageData1, 0, 0);
  ctxOut2.putImageData(outImageData2, 0, 0);
}
function roberts(data) {
  const matrix1 = [
      [-1, 0],
      [0, 1]
    ],
    matrix2 = [
      [0, -1],
      [1, 0]
    ];
  const Gx = handle(data, matrix1, (a, b) => a * b)
      .flat()
      .reduce((a, b) => a + b),
    Gy = handle(data, matrix2, (a, b) => a * b)
      .flat()
      .reduce((a, b) => a + b);
  return Math.sqrt(Gx * Gx + Gy * Gy);
}
function sobel(data) {
  const matrix1 = [
      [-1, -2, -1],
      [0, 0, 0],
      [1, 2, 1]
    ],
    matrix2 = [
      [-1, 0, 1],
      [-2, 0, 2],
      [-1, 0, 1]
    ];
  const Gx = handle(data, matrix1, (a, b) => a * b)
      .flat()
      .reduce((a, b) => a + b),
    Gy = handle(data, matrix2, (a, b) => a * b)
      .flat()
      .reduce((a, b) => a + b);
  return Math.sqrt(Gx * Gx + Gy * Gy);
}
function handle(m1, m2, f) {
  return m1.map((row, rowIndex) =>
    row.map((el, index) => f(el, m2[rowIndex][index]))
  );
}
function getPixelData(pixels, region, i) {
  const { data, width } = pixels;
  return region.map((row, rowIndex) =>
    row.map(
      (el, index) =>
        data[rowIndex * width + index * 4 + i] +
        data[rowIndex * width + index * 4 + i + 1] +
        data[rowIndex * width + index * 4 + i + 2]
    )
  );
}
Демка.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2022, 01:56
Помогаю со студенческими работами здесь

Создание оператора findAll
Создать оператор findAll который работает, как показано ниже: Seq napisy = LinkedSeq.make(“aaa”, “bb”, “cccc”, “ddd”); Seq result =...

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

Фильтр Собеля
Написала код для фильтра, выскакивают две ошибки, подскажите пожалуйста, что надо изменить в коде? Error, (in...

Оператор Собеля
Народ выручайте очень нужен Алгоритм оператора собеля написанный на C#? Нужно для написания диплома. Заранее спасибо! Добавлено...

Функция Собеля
Нашел в НЕТе функцию Собеля, но не могу в не понять как исправить ошибку undefined symbol 'rgb' в строке rgb = new RGBColor*; void...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
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 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru