Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
2 / 2 / 0
Регистрация: 04.05.2013
Сообщений: 22

Подсчёт количества объектов изображения

10.05.2013, 18:42. Показов 7555. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, господа.

Моя драма в следующем:
Стоит задача посчитать количество объектов на картинке с монохромным фоном, а так-же их площадь.
Поиск решения привёл меня к этой статье - http://habrahabr.ru/post/119244/
Но алгоритмы в ней описаны, к сожалению, применительно к SCILab'у.

Может быть у кого-нибудь завалялся пример реализации чего-то подобного средствами с++ builder'а?

Из похожего я наткнулся на код для определения цвета пикселя под курсором
C++
1
2
3
4
5
int x = Mouse->CursorPos.x;
int y = Mouse->CursorPos.y;
HDC WINAPI hdc = CreateDCA("DISPLAY", NULL, NULL, NULL);
TColor color = GetPixel(hdc, x, y);
DeleteDC(hdc);
и код для DElphi, для определения количества пикселей определённого цвета
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.Button2Click(Sender: TObject);
var i,j,n:integer;
    p:PByteArray;
    colors : array [0..255] of integer;
begin
     if not (Image1.Picture.Bitmap.PixelFormat in [pf24Bit, pf32Bit]) then
        raise exception.create('Error, Format File not supported!');
     Memo1.Lines.Clear;
     FillChar(colors,SizeOf(colors),0);
     n := Abs(Integer(Image1.Picture.Bitmap.ScanLine[1]) - Integer(Image1.Picture.Bitmap.ScanLine[0]));
     Gauge1.MaxValue:=100;
     Gauge1.Progress:=0;
     for i:=0 to Image1.Picture.Bitmap.Height-1 do
     begin
          P:=Image1.Picture.Bitmap.ScanLine[i];
          for j:=0 to n-1 do
              inc(colors[P^[j]]);
          Gauge1.Progress:=Round((i+1)*100/Image1.Picture.Bitmap.Height);
     end;
     for i:=0 to 255 do
     if colors[i]>0 then
     Memo1.Lines.Add('Цвет №'+IntToStr(i)+', количество='+IntToStr(colors[i]));
end;
Но, по скольку с битмапами не на с++ не на pascal'у ранее не работал, то и сообразить как бы из этого что-нибудь дельное составить пока не получается.

Буду предельно благодарен за любую помощь, или указания вектора поиска.
Заранее спасибо.)
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2013, 18:42
Ответы с готовыми решениями:

подсчет количества слов в тексте
как можно подсчитать сколько раз в тексте встречаетса какоето слово ?

Подсчет количества
Здравствуйте! У меня очень тяжелая проблема... В общем пытаюсь подсчитать количество материалов на складе на произвольную дату....

Подсчет количества объектов в БД
Добрый день! Я реализую базу данных книжного магазина и у меня возник маленький вопрос: Как сделать, чтобы при продажи определенного...

26
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
10.05.2013, 18:49
Объекты какой формы? Или вам распознавание образов?
0
2 / 2 / 0
Регистрация: 04.05.2013
Сообщений: 22
10.05.2013, 18:52  [ТС]
Формы произвольной. Круги, эллипсы, "пятна" в общем случае.
Мне распознавать их характеристики не обязательно. Просто найти количество групп "скучкованных" вместе пикселей и их количество.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
10.05.2013, 18:55
Охарактеризовать объект по каким-либо признакам его строения
там много чего есть
2
2 / 2 / 0
Регистрация: 04.05.2013
Сообщений: 22
10.05.2013, 18:56  [ТС]
Спасибо. Посмотрю.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
10.05.2013, 19:04
или ищите типа этого: Загрузить изображение в массив - берем пиксель, сравниваем его с соседним, если совпадает, что-нибудь с этим делаем.
1
2 / 2 / 0
Регистрация: 04.05.2013
Сообщений: 22
10.05.2013, 19:07  [ТС]
Это ещё ближе, спасибо!
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
10.05.2013, 20:47
Уменьшить количество цветов в изображении- определение смежных пикселей
1
10.05.2013, 21:25

Не по теме:

Цитата Сообщение от LK Посмотреть сообщение
там много чего есть
Почитал, вспомнил... все-таки увлекательная штука - исследование. Будоражит любопытство:)

0
2 / 2 / 0
Регистрация: 04.05.2013
Сообщений: 22
11.05.2013, 21:02  [ТС]
Ох. Вроде почитал, всё придумал. Но возникла вот какая странная вещь:
C++
1
2
3
4
for (int x=1;x<=Image1->Height;x++) {
for (int y=1;y<=Image1->Width;y++) {
q++;
Edit4->Text=q;
По логике должна быть площадь изображения. В тестовом варианте 603*454=273762. Однако независимо от размеров изображения результат:191096.
Более того, в цикле:
C++
1
2
3
4
for (int x=1;x<=454;x++) {
 
q++;
Edit4->Text=q;
Где q очевидно должен быть = 454, выдаёт 1637654.

Может я где-то дурак?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
11.05.2013, 22:00
у вас где-нибудь есть что-нибудь наподобие
C++
1
int q = 0;
, или какое начальное значение q непосредственно перед циклом?
1
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
14.05.2013, 08:28
C++
1
посчитать количество объектов на картинке с монохромным фоном, а так-же их площадь
все просто. циклами перебираем пиксели, если находим черный, применяем к нему белый FloodFill, увеличиваем счетчик объектов.
всё.
прикрутить поиск площади можно написав FloodFill ручками, что для расширения кругозора и советую сделать.
1
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
14.05.2013, 10:08
Цитата Сообщение от Zeszero Посмотреть сообщение
Ох. Вроде почитал, всё придумал. Но возникла вот какая странная вещь:
C++
1
2
3
4
for (int x=1;x<=Image1->Height;x++) {
for (int y=1;y<=Image1->Width;y++) {
q++;
Edit4->Text=q;
По логике должна быть площадь изображения. В тестовом варианте 603*454=273762. Однако независимо от размеров изображения результат:191096.
Более того, в цикле:
C++
1
2
3
4
for (int x=1;x<=454;x++) {
 
q++;
Edit4->Text=q;
Где q очевидно должен быть = 454, выдаёт 1637654.

Может я где-то дурак?

C++
1
2
3
4
for (int x=1;x<=Image1->Picture->Bitmap->Height;x++) {
for (int y=1;y<=Image1->Picture->Bitmap->Width;y++) {
q++;
Edit4->Text=q;
0
2 / 2 / 0
Регистрация: 04.05.2013
Сообщений: 22
14.05.2013, 20:19  [ТС]
Цитата Сообщение от AntonChik Посмотреть сообщение
C++
1
посчитать количество объектов на картинке с монохромным фоном, а так-же их площадь
все просто. циклами перебираем пиксели, если находим черный, применяем к нему белый FloodFill, увеличиваем счетчик объектов.
всё.
прикрутить поиск площади можно написав FloodFill ручками, что для расширения кругозора и советую сделать.
Эх. Если бы. Нужно же проверять соседние, на совпадение цвета, и в этом случае присваивать им какой-то идентификатор. Каждой связной области свой. После чего сканировать на количество идентифкаторов.

На подобии того, что вы предложили я сделал, но как подсчёт "площади"(суммы пикселей) интересующих меня объектов.

А вот как кодом реализовать поиск связных - пока не придумал. Точнее не придумал что за идентификатор присваивать и как его потом считывать.присваивать. Цветовой, то, понятное дело не подходит=\
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
15.05.2013, 05:21
ок. в спешке мне показалось что речь идет о монохромном изображении, а не фоне.
но как понять монохромный фон? однотонный? по идее это разные вещи, в данном случае моно предполагает 1 бит, а это 2 цвета.
или фон черно-белый, а объекты на нем цветные(кроме ч/б)? если так, то почему нельзя сделать фон одного цвета, а объекты другого и применить мой алгоритм? это будет просто как маска для подсчета объектов и рассчета их площади.
если нет, поясните.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,454
15.05.2013, 10:33
Цитата Сообщение от Zeszero Посмотреть сообщение
Добрый вечер, господа
1 создать матрицу значений типа int с размерами изображения заполненную нулями
2 начиная с первой точки проверять совпадает ли цвет точки с цветом фона
3 если не совпадает - это первая точка фигуры: назначаем фигуре следующий свободный порядковый номер и заносим его в матрицу в ячейку с координатами точки
4 для всех точек окружающих найденную точку проверяем совпадает ли их цвет с цветом фона
5 если не совпадает - это очередная точка фигуры: заносим номер фигуры в матрицу в ячейку с координатами точки
6 делаем это до тех пор пока не выберем все точки фигуры
7 берем следующую непроверенную точку (проверяем что в матрице в ячейке с координатами точки стоит ноль - эта точка не принадлежит ни одной из найденных фигур)
8 и так далее. в итоге последний из назначенных порядковых номеров будет количеством фигур
1
2 / 2 / 0
Регистрация: 04.05.2013
Сообщений: 22
06.07.2013, 19:48  [ТС]
И так, я здорово продвинулся, не без благодарности руководствуясь вашими советами.
В итоге подсчёт объектов происходит, храня значение в самом значении цвета пикселей. Перед этой процедурой изображение, понятное дело, приводится к чёрно-белому варианту. Однако в случае усложнения геометрии объектов начинаются всякие гадости, к примеру в случае кляксы, объектов может стать несколько миллионов, или -1 =\
Сканирование провожу при помощи корректирующей маски, вот код:
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
for (int x=1;x<=Image1->Width-1;x++) {
for (int y=1;y<=Image1->Height-1;y++) {
 
ProgressBar1->Position++;
//переменные соседних пикселей:
TColor col2 =Image1 -> Canvas -> Pixels[x-1][y+1];
TColor col3 =Image1 -> Canvas -> Pixels[x+1][y-1];
TColor col4 =Image1 -> Canvas -> Pixels[x][y+1];
TColor col5 =Image1 -> Canvas -> Pixels[x+1][y];
TColor col6 =Image1 -> Canvas -> Pixels[x-1][y];
TColor col7 =Image1 -> Canvas -> Pixels[x][y-1];
TColor col8 =Image1 -> Canvas -> Pixels[x-1][y-1];
TColor col9 =Image1 -> Canvas -> Pixels[x][y+2];
TColor col10 =Image1 -> Canvas -> Pixels[x+2][y];
TColor col11 =Image1 -> Canvas -> Pixels[x-2][y];
TColor col12 =Image1 -> Canvas -> Pixels[x][y-2];
TColor col13 =Image1 -> Canvas -> Pixels[x+2][y+2];
TColor col14 =Image1 -> Canvas -> Pixels[x-2][y+2];
TColor col15 =Image1 -> Canvas -> Pixels[x+2][y-2];
TColor col16 =Image1 -> Canvas -> Pixels[x-2][y-2];
 
TColor col =Image1 -> Canvas -> Pixels[x][y];//переменная текущего пикселя
 
 
if (col!=StrToInt(Edit1->Text)) {//сам выбор не размеченных пикселей
if (
col6!=clWhite && col6!=clBlack ||
col7!=clWhite && col7!=clBlack
 
 
)
{}
else {cv++;}
 
 
if (col2!=clBlack && col2!=col6) {col6=col2;cv=col2;}//корректирующая маска
if (col7!=clBlack && col6!=col7) {col6=col7;cv=col7;}
if (col8!=clBlack && col8!=clWhite && col8!=cv ) {cv=col8;}
 
Image1->Canvas->Pixels[x][y]=cv; }//пометка пикселя нужным "номером"
0
06.07.2013, 20:04

Не по теме:

Цитата Сообщение от Zeszero Посмотреть сообщение
Поиск решения привёл меня к этой статье - http://habrahabr.ru/post/119244/
Добавлю http://www.lektorium.tv/lecture/?id=13533

0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.07.2013, 12:51
Какой-то совсем не систематичный анализ. Почему не реализовать вариант алгоритма vxg с радиальным анализом и заполнением матрицы маркеров?
0
2 / 2 / 0
Регистрация: 04.05.2013
Сообщений: 22
07.07.2013, 12:56  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Какой-то совсем не систематичный анализ. Почему не реализовать вариант алгоритма vxg с радиальным анализом и заполнением матрицы маркеров?
К сожалению именно в таком виде у меня не заработало. Точнее количество найденных объектов было функцией их размера.
К примеру 1 круг на пол экрана считался тремя объектами, два одинаковых круга - 6-ю, если их уменьшить, то каждый считался за два.
Т.е. да, зависимость найденных объектов от их фактического количества была линейной, но большой радости в этом не было.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.07.2013, 12:56
Помогаю со студенческими работами здесь

Подсчет количества объектов на изображении
Суть задания: выделив контуры объектов на изображении, подсчитать их количество. (в качестве изображения может использоваться, например,...

Статическое поле класса: подсчет количества созданных объектов
Задание: Дополнить один из классов статическим полем, которое будет считать количество созданных объектов. Реализация: Объявление...

Работа с колонтитулами: анализ групп объектов, подсчет количества фигур
Добрый день. На странице word имеется группа объектов (линии, текстовые блоки). Как обратиться к текстовому блоку внутри группы. Поиском не...

Реализовать подсчет количества объектов класса, используя статическую переменную-член класса
как реализовать подсчет количества объектов класса (используя статическую переменную-член класса), а также статическую функцию, которая...

Подсчёт количества символов и количества строк в файле
Нужно написать программу, которая запрашивает у пользователя имя (адрес) текстового файла, далее открывает его и считает в нем количество...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru