Как найти маленькую картинку внутри большой? (как найти подстроку в строке?)

  • 25 августа 2023 г. 19:06
Ответы на вопрос 2
Этот код является общим примером и может потребовать некоторой настройки в зависимости от ваших конкретных потребностей. Он использует алгоритм SSIM, но вы также можете использовать другие алгоритмы сравнения изображений, такие как сравнение гистограмм или использование нейронных сетей для нахождения совпадений.

Кроме OpenCV, другая популярная библиотека для работы с изображениями - PIL (Python Imaging Library). PIL также предлагает множество функций для обработки изображений, включая функции сравнения и поиска совпадений.

Вот пример кода, использующего PIL для поиска подстроки в изображении:

```python
import PIL.Image as Image
import numpy as np

def find_subimage(subimage_path, image_path):
    # Загрузка изображений
    subimage = Image.open(subimage_path)
    image = Image.open(image_path)

    # Преобразование изображений в массив numpy
    subimage_data = np.array(subimage)
    image_data = np.array(image)

    # Поиск подстроки в изображении
    result = None
    try:
        x, y = np.where(np.all(image_data == subimage_data, axis=(0, 1)))
        if x.size > 0:
            result = (x[0], y[0])
    except ValueError:
        pass
    
    return result

# Пример использования функции
subimage_coordinates = find_subimage('subimage.png', 'image.png')

if subimage_coordinates:
    print("Координаты подстроки в изображении:", subimage_coordinates)
else:
    print("Подстрока не найдена в изображении.")
```

В этом коде `subimage.png` - это небольшая картинка (подстрока), которую вы ищете в изображении `image.png`. Код сравнивает массивы пикселей обеих картинок, находит их совпадения и возвращает координаты левого верхнего угла найденной подстроки в изображении. Если подстрока не найдена, выводится соответствующее сообщение.

Оба примера используют открытые библиотеки, которые могут быть установлены с помощью инструмента pip и поддерживаются различными операционными системами.
1. Пользуясь библиотекой OpenCV, вы можете выполнить следующие действия:
```python
import cv2
import numpy as np

# Загрузка изображений
image = cv2.imread('image.jpg', 0)
template = cv2.imread('part.jpg', 0)

# Выполнение шаблонного сопоставления
res = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)

# Поиск минимального и максимального значений
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

# Задание порогового значения
threshold = 0.8

# Проверка результата сравнения с порогом
if max_val > threshold:
    top_left = max_loc
    print("Подкартинка найдена:", top_left)
else:
    print("Подкартинка не найдена")
```
2. Помимо этого, вы можете настраивать значение порога, чтобы улучшить точность работы алгоритма.
Похожие вопросы