Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 26.03.2020
Сообщений: 15

При обнаружении нового объекта нужно создавать новую структуру. Можно ли как-нибудь зациклить процесс создания структур

25.10.2021, 17:56. Показов 821. Ответов 4

Студворк — интернет-сервис помощи студентам
Всем добрый день!
Столкнулся с такой проблемой. Есть изображение, в котором 0 - это фон, а любые ненулевые пикселы - это объекты. Мне нужно организовать алгоритм по типу Connected Components Labeling, т.е. поставить в соответствие каждому ненулевому пикселу номер (mark) того объекта, которому он принадлежит. Кроме того, нужно записывать его координаты и значение. Все эти значения записываю в структуру.
Но вопрос в следующем. При обнаружении нового объекта, т.е. нового скопления ненулевых пикселей, никак не связанного с предыдущим, нужно создавать новую структуру. Можно ли как-нибудь зациклить процесс создания структур? Вообщем, грубо говоря, чтоб было так : if (a > b): create new struct. Я понимаю, что такой функции в Матлаб нет, но может кто подскажет как реализовать подобную функцию. Следует отметить, что встроенные функции (bwlabel и тд) не подходят. Буду благодарен любому участию.
Matlab M
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
I = imread('t.png');
[x,y] = size(I);
B = zeros(size(I)); %вспомогательная матрица
s = struct('id', '', 'x', '', 'y', '', 'value', '');
mark = 0;
a = 1; %номер строки структуры
for i = 1:x
    for j = 1:y
        if I(i,j) ~= 0
            if I(i,j-1) ~= 0 || I(i-1,j) ~= 0 %или верхний или левый пиксел ненулевые
                %присвоить пикселу тот же маркер, записать в ту же структуру:
                B(i,j) = mark;
                s(a).id = mark;
                s(a).x = i;
                s(a).y = j;
                s(a).value = I(i,j);
                a = a + 1;
            elseif I(i,j-1) ~= 0 && I(i-1,j) ~= 0 %и левый и верхний ненулевые
                % if маркер левого == маркеру верхнего:
                if B(i,j-1) == B(i-1,j)
                    % присвоить пикселу тот же маркер, записать в ту же
                    % структуру:
                    B(i,j) = mark;
                    s(a).id = mark;
                    s(a).x = i;
                    s(a).y = j;
                    s(a).value = I(i,j);
                    a = a + 1;
                else %маркер левого не равен маркеру верхнего
                    %присвоить пикселу маркер верхнего: 
                    B(i,j) = B(i-1,j);
                    %записать в ту же структуру, что и верхний;
                    
                    %всем пикселам имеющим marker == marker(i-1,j) + 1
                    %(маркер на единицу больший, чем у верхнего пиксела)
                    %присвоить marker = marker(i-1,j) (присвоить маркер верхнего);
                    
                    %переписать их в структуру, которой принадлежит верхний пиксел;
                end
            elseif I(i,j-1) == 0 && I(i-1,j) == 0
                marker = marker + 1;
                %создаем новую структуру и записываем туда значения;
            end
        end
    end
end
 Комментарий модератора 
Правила форума, пункт 4.3. Создавайте темы с осмысленными и понятными названиями - это серьезно повышает шансы, что на ваш вопрос ответят.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.10.2021, 17:56
Ответы с готовыми решениями:

Нужно ли создавать новый Render для каждого нового объекта (SDL2)?
Есть окно сделанное с помощью SDL2 и класс объекта. Нужно нарисовать множество таких объектов, которые будут менять свои характеристики...

Кто-нибудь знает как можно программно заполнять (создавать) файлы справки Windows
Кто-нибудь знает как можно программно заполнять (создавать) файлы справки Windows. : Желание ж таково: при программировании своих модулей...

Можно ли представить структуру как элемент массива, т е массив состоящий из однотипных структур
Можно ли представить структуру как элемент массива, т е массив состоящий из однотипных структур

4
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
26.10.2021, 12:43
Bill Septimus, не очень понимаю, в чём проблема. У вас же и так меняется id, что говорит о другой области. Как вариант:
Кликните здесь для просмотра всего текста
Matlab M
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
clear; clc;
I = imread('t.png');
I = I(:, :, 1);
[x,y] = size(I);
B = zeros(size(I)); %вспомогательная матрица
s = {};
mark = 0;
a = 1; %номер строки структуры
for i = 1:x
    for j = 1:y
        if I(i,j) ~= 0
            if I(i,j-1) ~= 0 || I(i-1,j) ~= 0 %или верхний или левый пиксел ненулевые
                %присвоить пикселу тот же маркер, записать в ту же структуру:
                B(i,j) = mark;
                s{mark}(a).id = mark;
                s{mark}(a).x = i;
                s{mark}(a).y = j;
                s{mark}(a).value = I(i,j);
                a = a + 1;
            elseif I(i,j-1) ~= 0 && I(i-1,j) ~= 0 %и левый и верхний ненулевые
                % if маркер левого == маркеру верхнего:
                if B(i,j-1) == B(i-1,j)
                    % присвоить пикселу тот же маркер, записать в ту же
                    % структуру:
                    B(i,j) = mark;
                    s{mark}(a).id = mark;
                    s{mark}(a).x = i;
                    s{mark}(a).y = j;
                    s{mark}(a).value = I(i,j);
                    a = a + 1;
                else %маркер левого не равен маркеру верхнего
                    %присвоить пикселу маркер верхнего: 
                    B(i,j) = B(i-1,j);
                    %записать в ту же структуру, что и верхний;
                    
                    %всем пикселам имеющим marker == marker(i-1,j) + 1
                    %(маркер на единицу больший, чем у верхнего пиксела)
                    %присвоить marker = marker(i-1,j) (присвоить маркер верхнего);
                    
                    %переписать их в структуру, которой принадлежит верхний пиксел;
                end
            elseif I(i,j-1) == 0 && I(i-1,j) == 0
                mark = mark + 1;
                %создаем новую структуру и записываем туда значения;
                s{mark} = struct('id', '', 'x', '', 'y', '', 'value', '');
                a = 1; %номер строки структуры
            end
        end
    end
end


Добавлено через 1 минуту
И ваша программа вылетит, если в первой строке/столбце будет ненулевой пиксель.
1
0 / 0 / 0
Регистрация: 26.03.2020
Сообщений: 15
26.10.2021, 14:01  [ТС]
Попробовал так как вы предлагаете, Матлаб начал ругаться на то, что нельзя структуры индексировать в фигурных скобках:Unable to perform assignment because brace indexing is not supported for variables of this type. Error in CCLab_new (line 15) s{mark}(a).id = mark;
0
1298 / 927 / 449
Регистрация: 21.10.2012
Сообщений: 2,604
26.10.2021, 14:15
Bill Septimus, судя по всему, вы не скопировали код из моего сообщения, а попытались свой переписать, т.к. у меня s - это не структура, это массив ячеек, в каждой из которых лежит уже массив структур.
1
0 / 0 / 0
Регистрация: 26.03.2020
Сообщений: 15
26.10.2021, 14:37  [ТС]
Вы абсолютно правы, я именно так и сделал. Прошу прощения за невнимательность. Все работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.10.2021, 14:37
Помогаю со студенческими работами здесь

Перегрузка оператора без создания нового объекта
Если вкратце то вопросы звучат так: Можно ли на практике делать перегрузку оператора без создания нового объекта и какие баги (или нечто...

Передача существующего объекта вместо создания нового
Есть класс Word. Он неизменяемый: все методы - константные. Учитывая это я пытаюсь создать класс таким образом чтобы вместо создания...

Автоматическое фото от android смартфона с максимальным разрешением, при обнаружении объекта opencv
Приветствую всех. Пишу приложение под android, которое с помощью opencv и с++ на preview детектирует нужный объект. Задача: после...

Отобразить процесс загрузки (создания) объекта/куска_кода в ProgressBar
Итак, здравствуйте, у меня есть объект ProgressBar и кусок кода: // ... var excelApp = new...

Нужно ли создавать новую базу данных для второго сайта
здравствуйте. Я делала себе сайт (zisclub)на open server,на joomla. Хочу сделать второй сайт. Создала название и скопировала joomla в...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
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