Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.187.121] |
|
Сообщ.
#1
,
|
|
|
Мне нужно подсчитать количество фрагментов на изображении. Приложение должно быть десктопное, без использования интернета. Шаблон фрагмента - это элемент изображения, полученный из этого же изображения путем выделения нужного фрагмента и его сохранения. Фрагменты на изображении не перекрываются. В интернете много информации по обработке изображений с помощью ИИ, а есть более простые способы решения этой задачи? К сожалению, раньше обработкой изображений не занимался. Пока научился на C# загружать изображения, перемещаться по пикселам. Помогите, пожалуйста, ссылками на учебники и ресурсы, которые помогли бы мне решить эту задачу.
|
Сообщ.
#2
,
|
|
|
Цитата tumanovalex @ Фрагменты на изображении не перекрываются. А какой был фон ДО нанесения на него фрагментов? Тут три варианта: №1. Однотонный фон. Тогда достаточно посчитать отдельные фрагменты, контрастные с фоном, ведь "Фрагменты на изображении не перекрываются". №2. Фон - заранее известная картинка. Тогда достаточно вычесть из результата эту картинку, и получим №1. №3. Фон случайный и заранее неизвестен - тогда задача нерешаема, ведь фон заранее может содержать участки, похожие на искомое изображение. |
Сообщ.
#3
,
|
|
|
Я плохо рассказал о задаче. Фона, на который накладываются картинки, нет. Есть просто картинка (jpg), на которой есть одинаковые элементы. Эти элементы повторяются по горизонтали (несколько рядов элементов на изображении), между ними есть небольшие расстояния по вертикали и горизонтали (поэтому и указал, что они не пересекаются). В качестве шаблона для подсчета можно в графическом редакторе вырезать один из элементов на изображении, сохранить и использовать его для подсчета. В качестве примера прикрепил картинку типа "шахматная доска", на которой нужно определить, например, количество черных квадратов, белых квадратов, пар "белый и черный квадрат". Изображение может быть цветным или черно-белым. На реальной картинке элементы более сложные.Я где-то читал, что нужно вычислить корреляционную функцию между изображением и его шаблоном. Если эта функция имеет наибольшее значение, то значит участок изображения очень похож на шаблон. Как я понимаю, нужно по изображению "перемещать" шаблон и вычислять корреляционную функцию между участком изображения и шаблона. Вот только не помню, как нужно было вычислять эту функцию. Есть, наверное, и другие способы.
Прикреплённая картинка
|
Сообщ.
#4
,
|
|
|
Цитата tumanovalex @ Фона, на который накладываются картинки, нет. Есть просто картинка (jpg), на которой есть одинаковые элементы. А между этими элементами что? Фона не может не быть, JPG - это прямоугольное изображение, если между фрагментами есть расстояние, значит есть пиксели с каким-то содержимым. Вопрос - с каким. Ответ "с каким угодно" не годится, ведь может оказаться рисунок, в точности соответствующий исходному фрагменту, тогда мы его не отличим. Так что, если нужно решение - нужна более строгая формулировка условия задачи. А если нужно определение корреляционной функции, так его нет в общем виде - мы сами определяем условия соответствия одного изображения другому. |
Сообщ.
#5
,
|
|
|
Цитата tumanovalex @ В интернете много информации по обработке изображений с помощью ИИ, а есть более простые способы решения этой задачи? К сожалению, раньше обработкой изображений не занимался Заплатят больше за решение с помощью ИИ. |
Сообщ.
#6
,
|
|
|
Посмотрите на странице https://ru.stackoverflow.com/questions/8123...и/812762#812762, там есть пример и обсуждение темы поиска по шаблону
|
Сообщ.
#7
,
|
|
|
Спасибо за ссылку. Обязательно посмотрю. По ссылке https://docs.opencv.org/4.x/d4/dc6/tutorial...e_matching.html есть пример Template Matching with Multiple Objects на Питоне:
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) |
Сообщ.
#8
,
|
|
|
tumanovalex
Питон несёт с собой фуеву тучу библиотек, за что очень любим говнокодерами. Предлагаете всё переписать на С? Это большая коммерческая работа. |
Сообщ.
#9
,
|
|
|
Нашелся добрый человек, который сделал код на C++ (https://www.cyberforum.ru/graphics-dev/thread2907053.html). Я попытался переделать его для определения количества найденных по шаблону SquareBlackColor.jpg фрагментов в изображении pattern.jpg (изображения есть в прикрепленном проекте)
#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++; } } } Прикреплённый файлCppOpenCVstudy.zip (19,48 Кбайт, скачиваний: 60) |