На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Определение количества фрагментов на изображении
    Мне нужно подсчитать количество фрагментов на изображении. Приложение должно быть десктопное, без использования интернета. Шаблон фрагмента - это элемент изображения, полученный из этого же изображения путем выделения нужного фрагмента и его сохранения. Фрагменты на изображении не перекрываются. В интернете много информации по обработке изображений с помощью ИИ, а есть более простые способы решения этой задачи? К сожалению, раньше обработкой изображений не занимался. Пока научился на C# загружать изображения, перемещаться по пикселам. Помогите, пожалуйста, ссылками на учебники и ресурсы, которые помогли бы мне решить эту задачу.
      Цитата tumanovalex @
      Фрагменты на изображении не перекрываются.

      А какой был фон ДО нанесения на него фрагментов? Тут три варианта:
      №1. Однотонный фон. Тогда достаточно посчитать отдельные фрагменты, контрастные с фоном, ведь "Фрагменты на изображении не перекрываются".
      №2. Фон - заранее известная картинка. Тогда достаточно вычесть из результата эту картинку, и получим №1.
      №3. Фон случайный и заранее неизвестен - тогда задача нерешаема, ведь фон заранее может содержать участки, похожие на искомое изображение.
        Я плохо рассказал о задаче. Фона, на который накладываются картинки, нет. Есть просто картинка (jpg), на которой есть одинаковые элементы. Эти элементы повторяются по горизонтали (несколько рядов элементов на изображении), между ними есть небольшие расстояния по вертикали и горизонтали (поэтому и указал, что они не пересекаются). В качестве шаблона для подсчета можно в графическом редакторе вырезать один из элементов на изображении, сохранить и использовать его для подсчета. В качестве примера прикрепил картинку типа "шахматная доска", на которой нужно определить, например, количество черных квадратов, белых квадратов, пар "белый и черный квадрат". Изображение может быть цветным или черно-белым. На реальной картинке элементы более сложные.Я где-то читал, что нужно вычислить корреляционную функцию между изображением и его шаблоном. Если эта функция имеет наибольшее значение, то значит участок изображения очень похож на шаблон. Как я понимаю, нужно по изображению "перемещать" шаблон и вычислять корреляционную функцию между участком изображения и шаблона. Вот только не помню, как нужно было вычислять эту функцию. Есть, наверное, и другие способы.
        Прикреплённая картинка
        Прикреплённая картинка
          Цитата tumanovalex @
          Фона, на который накладываются картинки, нет. Есть просто картинка (jpg), на которой есть одинаковые элементы.

          А между этими элементами что? Фона не может не быть, JPG - это прямоугольное изображение, если между фрагментами есть расстояние, значит есть пиксели с каким-то содержимым. Вопрос - с каким. Ответ "с каким угодно" не годится, ведь может оказаться рисунок, в точности соответствующий исходному фрагменту, тогда мы его не отличим.
          Так что, если нужно решение - нужна более строгая формулировка условия задачи.
          А если нужно определение корреляционной функции, так его нет в общем виде - мы сами определяем условия соответствия одного изображения другому.
            Цитата tumanovalex @
            В интернете много информации по обработке изображений с помощью ИИ, а есть более простые способы решения этой задачи? К сожалению, раньше обработкой изображений не занимался

            Заплатят больше за решение с помощью ИИ.
              Посмотрите на странице https://ru.stackoverflow.com/questions/8123...и/812762#812762, там есть пример и обсуждение темы поиска по шаблону
                Спасибо за ссылку. Обязательно посмотрю. По ссылке https://docs.opencv.org/4.x/d4/dc6/tutorial...e_matching.html есть пример Template Matching with Multiple Objects на Питоне:
                ExpandedWrap disabled
                  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)
                К сожалению, с Питоном не знаком. Хотел бы перевести код на С++. По функциям OpenCV вопросов нет. Непонятные мне вещи указал в комментариях к коду. Может быть кто-нибудь поможет перевести код на С++?
                  tumanovalex
                  Питон несёт с собой фуеву тучу библиотек, за что очень любим говнокодерами. Предлагаете всё переписать на С? Это большая коммерческая работа.
                    Нашелся добрый человек, который сделал код на C++ (https://www.cyberforum.ru/graphics-dev/thread2907053.html). Я попытался переделать его для определения количества найденных по шаблону SquareBlackColor.jpg фрагментов в изображении pattern.jpg (изображения есть в прикрепленном проекте)
                    ExpandedWrap disabled
                      #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 изображению видно, что фрагменты были найдены. Может кто-нибудь подскажет, как подсчитать количество найденных фрагментов.
                    Прикреплённый файлПрикреплённый файлCppOpenCVstudy.zip (19,48 Кбайт, скачиваний: 57)
                    Сообщение отредактировано: tumanovalex -
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0386 ]   [ 21 queries used ]   [ Generated: 28.03.24, 20:17 GMT ]