Форум программистов, компьютерный форум, киберфорум
Программирование графики
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886

Определение количества фрагментов на изображении

23.11.2021, 07:43. Показов 4526. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно подсчитать количество фрагментов на изображении. Приложение должно быть десктопное, без использования интернета. Шаблон фрагмента - это элемент изображения, полученный из этого же изображения путем выделения нужного фрагмента и его сохранения. Фрагменты на изображении не перекрываются. В интернете много информации по обработке изображений с помощью ИИ, а есть более простые способы решения этой задачи? К сожалению, раньше обработкой изображений не занимался. Пока научился на C# загружать изображения, перемещаться по пикселам. Помогите, пожалуйста, ссылками на учебники и ресурсы, которые помогли бы мне решить эту задачу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.11.2021, 07:43
Ответы с готовыми решениями:

Определение количества пикселей на изображении
дано цветное изображение, нужно посчитать процентное количество одинаковых пикселей в окрестности, не зная цвета

Определение текста на изображении
Всем привет! Можно ли как-то на изображении найти текст (текст белого цвета, без наклона, в одну строку, с фиксированным размером)?

Определение доминирующего цвета на изображении
Приветствую ребята, подскажите пожалуйста, как определить доминирующие цвета на изображении ? Есть массив пикселей в формате RGB, есть идея...

11
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.11.2021, 08:30
Лучший ответ Сообщение было отмечено tumanovalex как решение

Решение

Цитата Сообщение от tumanovalex Посмотреть сообщение
Помогите, пожалуйста, ссылками на учебники и ресурсы, которые помогли бы мне решить эту задачу.
Есть библиотека OpenCV. Она это умеет.
1
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886
23.11.2021, 20:34  [ТС]
А можно ли обойтись без сторонней библиотеки. Я, наверное, плохо рассказал о задаче. Есть просто картинка (jpg), на которой есть одинаковые элементы. Эти элементы повторяются по горизонтали (несколько рядов элементов на изображении), между ними есть небольшие расстояния по вертикали и горизонтали (поэтому и указал, что они не пересекаются). В качестве шаблона для подсчета можно в графическом редакторе вырезать один из элементов на изображении, сохранить и использовать его для подсчета. В качестве примера прикрепил картинку типа "шахматная доска", на которой нужно определить, например, количество черных квадратов, белых квадратов, пар "белый и черный квадрат". Изображение может быть цветным или черно-белым. На реальной картинке элементы более сложные. Я где-то читал, что нужно вычислить корреляционную функцию между изображением и его шаблоном. Если эта функция имеет наибольшее значение, то значит участок изображения очень похож на шаблон. Как я понимаю, нужно по изображению "перемещать" шаблон и вычислять корреляционную функцию между участком изображения и шаблона. Вот только не помню, как нужно было вычислять эту функцию. Есть, наверное, и другие способы.
Миниатюры
Определение количества фрагментов на изображении  
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
23.11.2021, 21:14
Цитата Сообщение от tumanovalex Посмотреть сообщение
А можно ли обойтись без сторонней библиотеки.
Вы сами не в состоянии нагуглить себе теоретические материалы? Посмотрите этот курс лекций.
0
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886
30.11.2021, 23:16  [ТС]
К сожалению, с Питоном не знаком. Хотел бы перевести код на С++. По функциям OpenCV вопросов нет. Непонятные мне вещи указал в комментариях к коду. Может быть кто-нибудь поможет перевести код на С++?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv.imread('mario.png')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png',0)
#Получение формы изображения-шаблона и определение размеров формы шаблона по горизонтали и вертикали?
w, h = template.shape[::-1] 
#Получение результата сравнения с шаблоном-одно изображение?
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED) 
threshold = 0.8
# сравнение с порогом
loc = np.where( res >= threshold) 
# откуда появляется массив?
for pt in zip(*loc[::-1]) 
# выделение красным каждого найденного объекта?
    cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2) 
cv.imwrite('res.png',img_rgb)
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
01.12.2021, 14:04
Лучший ответ Сообщение было отмечено tumanovalex как решение

Решение

Цитата Сообщение от tumanovalex Посмотреть сообщение
К сожалению, с Питоном не знаком. Хотел бы перевести код на С++.
По ссылке из второго поста есть туториалы и на С++. Вот пример того же самого для вашей картинки из третьего поста(с поиском черных квадратов по шаблону):
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
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
 
int main()
{
    try
    {
        auto image = cv::imread("pattern.jpg");
        CV_Assert(!image.empty());
        auto const subRectSize = cv::Size(33, 33);
        auto templ = cv::Mat(image, cv::Rect(cv::Point(2, 4), subRectSize));
        auto result = cv::Mat(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32FC1);
        cv::matchTemplate(image, templ, result, cv::TM_CCOEFF_NORMED);
        auto first = result.begin<float>();
        auto last = result.end<float>();
        for(;first != last; ++first) {
            if (*first > 0.9f) {
                cv::rectangle(image, cv::Rect(first.pos(), subRectSize), {0, 0, 255}, 2);
            }
        }
        cv::namedWindow("matching");
        cv::imshow("matching", image);
        cv::waitKey();
    }
    catch (std::exception const &err)
    {
        std::cerr << err.what() << '\n';
    }
}
Изображения
 
1
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886
09.12.2021, 21:50  [ТС]
Спасибо большое, zayats80888! Мне нужно сравнивать оригинальное изображение с шаблоном и получить количество совпадений. Попробовал из оригинального изображения вырезать черный квадрат в качестве шаблона и сравнить изображение с шаблоном с помощью matchTemplate. Пока не получилось, почему-то для оригинального изображения получаю (UINT8,3*2547*2231), а для шаблона (UINT8,1*32*31). Видимо, из-за этого и matchTemplate дает ошибку. Буду разбираться.
0
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886
10.12.2021, 20:13  [ТС]
Я попытался переделать его для определения количества найденных по шаблону SquareBlackColor.jpg фрагментов в изображении pattern.jpg (изображения есть в прикрепленном проекте)
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
#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
 
void DisplayMessage(std::string sMes)
{
  std::cout << sMes << std::endl;
  system("pause");
  exit(EXIT_SUCCESS);
}
 
int main(int argc, char** argv)
{
  if (argv[1] == NULL)
    DisplayMessage("Original image missing!");
  if (argv[2] == NULL)
    DisplayMessage("Template image missing!");
  if (argc > 3)
    DisplayMessage("There should be two parameters in the command line!");
  cv::Mat imgorig  = imread(argv[1], cv::IMREAD_UNCHANGED);
  cv::Mat imgtempl = imread(argv[2], cv::IMREAD_UNCHANGED);
  cv::Mat result = cv::Mat(imgorig.rows - imgtempl.rows + 1, imgorig.cols - imgtempl.cols + 1, CV_32FC1);
  cv::matchTemplate(imgorig, imgtempl, result, cv::TM_CCOEFF_NORMED);
  cv::namedWindow("Result", cv::WINDOW_NORMAL);
  cv::imshow("Result", result);
  cv::imwrite("Result.jpg", result);
  auto first = result.begin<float>();
  auto last = result.end<float>();
  cv::waitKey(0);
  int i = 0;
  for (; first != last; ++first)
  {
   if (*first > 0.9f)
    {
      i++;
    }
  }
}
но ничего не получилось, в цикле в ветку if нет заходов. Хотя по полученному в результате работы matchTemplate изображению видно, что фрагменты были найдены. Может кто-нибудь подскажет, как подсчитать количество найденных фрагментов?
Вложения
Тип файла: zip CppOpenCVstudy.zip (19.5 Кб, 2 просмотров)
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.12.2021, 21:20
Лучший ответ Сообщение было отмечено tumanovalex как решение

Решение

Цитата Сообщение от tumanovalex Посмотреть сообщение
но ничего не получилось, в цикле в ветку if нет заходов. Хотя по полученному в результате работы matchTemplate изображению видно, что фрагменты были найдены
Очевидно "порог" совпадения не превышает 0.9
Цитата Сообщение от tumanovalex Посмотреть сообщение
Может кто-нибудь подскажет, как подсчитать количество найденных фрагментов?
Зависит от того, что нужно считать, учитывать ли пересечения и т.д.

Если просто, то можно выбрать другой метод анализа совпадений(TM_SQDIFF_NORMED), потом разделить значения по порогу(threshold) и посчитать контуры.
C++
1
2
3
4
5
6
7
8
//...
cv::matchTemplate(imgorig, imgtempl, result, cv::TM_SQDIFF_NORMED);
cv::threshold(result, result, 0.9, 1.0, cv::THRESH_BINARY_INV);
result.convertTo(result, CV_8UC1, 255);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(result, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
std::cout << contours.size() << '\n';
//...
1
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886
10.12.2021, 22:46  [ТС]
Спасибо большое за ответ и Вашу помощь!
Мне нужно считать только совпадения, перекрытий фрагментов изображения, похожих на шаблон, нет. Между рядами фрагментов изображения, похожих на шаблон, есть черные полосы, отделяющие одну строчку фрагментов изображения от другой. Строк может быть много.
Я так понял алгоритм:
- подбирается метод анализа совпадений так, чтобы результат работы matchTemplate давал самую четкую картинку;
- подбирается метод (функции OpenCV), которые из полученной в результате работы matchTemplate картинки выделяют элементы, по которым можно определить количество совпадений.
Правильно ли я понял?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.12.2021, 22:53
Цитата Сообщение от tumanovalex Посмотреть сообщение
Правильно ли я понял?
Наверное...
Я не разбираюсь в анализе изображений.
Просто посмотрел документацию по функциям и прилепил, как мне показалось, то, что подходит для вашего конкретного случая.

Не по теме:

А вообще, на форуме есть отдельный раздел по OpenCV в C++

1
95 / 15 / 3
Регистрация: 09.07.2009
Сообщений: 886
10.12.2021, 23:06  [ТС]
Спасибо большое за ответы! Буду задавать вопросы по OpenCV в соответствующем форуме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2021, 23:06
Помогаю со студенческими работами здесь

с++ Opencv 2.4 Определение лица на изображении
установил opencv2.4 http://www.samontab.com/web/2012/06/installing-opencv-2-4-1-ubuntu-12-04-lts/ Определение лица на изображении. ...

Определение статических жестов на изображении
Привет всем, задача такая. Есть фотки руки, где показано: два, три и четыре пальца.(фотки я вложил) Нужно создать программу которая...

Определение центров объектов на изображении
Добрый день. Имеется бинарное изображение. Требуется определить координаты центров каждого объекта. Для одного объекта делается...

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
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, то после закрытия окошка. . .
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru