В чём разница между OpenCV и scikit-image?

OpenCV и scikit-image — это две популярные библиотеки для обработки изображений в Python, но они различаются по архитектуре, философии, интерфейсам, функционалу и области применения. Обе применяются в задачах компьютерного зрения, но имеют разные целевые аудитории и стилевые подходы.

Общее описание

OpenCV (Open Source Computer Vision Library)

  • Разработана на C++, предоставляет привязки к Python, Java и другим языкам.

  • Основной упор — высокопроизводительные алгоритмы компьютерного зрения.

  • Подходит как для реального времени, так и для научных задач.

  • Очень широко используется в промышленности, робототехнике, системах наблюдения и мобильных приложениях.

scikit-image

  • Часть научного Python-стека (вместе с NumPy, SciPy, matplotlib).

  • Написана на Python (частично на Cython для ускорения).

  • Подходит для исследовательских и академических целей, а также для интерактивного анализа изображений.

  • Предоставляет чистые API и документацию в научном стиле.

Основные отличия

Критерий OpenCV scikit-image
Язык реализации C++ (с Python-обёрткой) Python, Cython
--- --- ---
Производительность Очень высокая (подходит для реального времени) Средняя (больше для оффлайн-обработки)
--- --- ---
Подход к API Процедурный (функции в стиле cv2.method(...)) Функциональный (модули с понятной структурой)
--- --- ---
Совместимость с NumPy Частичная (нужно учитывать BGR-цвета, dtype) Полная (всё — массивы NumPy с явной типизацией)
--- --- ---
Цветовое пространство BGR по умолчанию RGB по умолчанию
--- --- ---
Интерфейс обработки Императивный, низкоуровневый Научно-ориентированный, модульный
--- --- ---
Анимация и видео Да (чтение/запись видео, камеры, трекинг и т.д.) Нет (работает только с изображениями)
--- --- ---
Фокус на компьютерное зрение Да (детекция объектов, лица, трекинг, оптика и т.д.) Нет (фокус на структурном и численном анализе)
--- --- ---
Совместимость с SciPy-стеком Частичная Полная (совместим с NumPy, SciPy, matplotlib)
--- --- ---
Применение в ML/DL Часто используется для подготовки данных Чаще используется для анализа и визуализации
--- --- ---

Цветовое пространство

OpenCV

Использует формат BGR при чтении изображений:

```python
img = cv2.imread("image.jpg") # Цвета перепутаны
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

### **scikit-image**

Всегда использует **RGB**, совместим с matplotlib:  
<br/>```python
from skimage import io
img = io.imread("image.jpg") # Уже в RGB

Работа с изображениями

Операция OpenCV scikit-image
Чтение изображения cv2.imread() skimage.io.imread()
--- --- ---
Сохранение cv2.imwrite() skimage.io.imsave()
--- --- ---
Отображение cv2.imshow() matplotlib.pyplot.imshow()
--- --- ---
Изменение размера cv2.resize() skimage.transform.resize()
--- --- ---
Градиенты, контуры cv2.Sobel, cv2.Canny skimage.filters, skimage.feature.canny
--- --- ---
Преобразование цвета cv2.cvtColor() skimage.color.rgb2gray() и др.
--- --- ---
Морфология cv2.erode(), cv2.dilate() skimage.morphology
--- --- ---
Фильтрация cv2.GaussianBlur(), cv2.blur() skimage.filters.gaussian(), median()
--- --- ---
Пороговая обработка cv2.threshold() skimage.filters.threshold_otsu() и др.
--- --- ---
Выделение объектов cv2.findContours() skimage.measure.label(), regionprops()
--- --- ---
Работа с видео Да Нет
--- --- ---
Рисование cv2.line(), cv2.circle() Нет (используйте matplotlib или Pillow)
--- --- ---

Пример: Пороговая обработка

OpenCV

import cv2
img = cv2.imread("img.png", 0)
\_, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

scikit-image

from skimage import io, filters
img = io.imread("img.png", as_gray=True)
thresh_val = filters.threshold_otsu(img)
binary = img > thresh_val

Пример: Изменение размера изображения

OpenCV

resized = cv2.resize(img, (300, 300))

scikit-image

from skimage.transform import resize
resized = resize(img, (300, 300), anti_aliasing=True)

Пример: Детекция границ (Canny)

OpenCV

edges = cv2.Canny(img, 100, 200)

scikit-image

from skimage import feature
edges = feature.canny(img, sigma=1)

Поддержка видео и реального времени

OpenCV

Поддерживает камеры, потоковое видео, кодеки:

```python
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
cv2.imshow("Frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()

### **scikit-image**

- Нет встроенной поддержки видео. Используется только для **статичных изображений**.  


## **Типы изображений и массивов**

| **Свойство** | **OpenCV** | **scikit-image** |
| --- | --- | --- |
| Тип данных по умолчанию | uint8 | float64 (0.0–1.0) |
| --- | --- | --- |
| Диапазон значений пикселей | 0–255 | 0.0–1.0 (в большинстве функций) |
| --- | --- | --- |
| Требует ручного нормирования | Часто | Автоматически используется |
| --- | --- | --- |

## **Поддержка машинного обучения и deep learning**

- **OpenCV** включает модуль cv2.dnn для инференса нейросетей (поддержка ONNX, TensorFlow, Caffe, Torch).  

- Используется для **интеграции нейросетей с видео и изображениями в реальном времени**.  


```python
net = cv2.dnn.readNetFromONNX("model.onnx")
blob = cv2.dnn.blobFromImage(img, scalefactor=1/255.0, size=(224, 224))
net.setInput(blob)
output = net.forward()
  • scikit-image не включает встроенной поддержки нейросетей, но часто используется в предобработке данных для обучения моделей через scikit-learn, PyTorch, TensorFlow.

Документация и структура модулей

OpenCV

  • Документация: https://docs.opencv.org/
  • Функции сгруппированы по модулям:

    • cv2.imgproc — обработка изображений

    • cv2.videoio — работа с видео

    • cv2.dnn — нейросети

    • cv2.objdetect — каскады Хаара и т.д.

scikit-image

  • Документация: https://scikit-image.org/docs/stable/
  • Модули:

    • skimage.io — ввод/вывод

    • skimage.color — преобразование цветов

    • skimage.filters — фильтры

    • skimage.feature — извлечение признаков

    • skimage.segmentation, measure, morphology, и т.д.

Для каких задач выбрать какую библиотеку

Задача Лучше использовать
Детекция лиц, объектов, оптический поток OpenCV
--- ---
Чтение/запись видео, работа с камерой OpenCV
--- ---
Быстрая обработка в реальном времени OpenCV
--- ---
Исследование алгоритмов обработки scikit-image
--- ---
Научные публикации, визуализация scikit-image + matplotlib
--- ---
Учебные курсы и исследовательская работа scikit-image
--- ---
Комплексные проекты с нейросетями и видео OpenCV + PyTorch/TensorFlow
--- ---

Обе библиотеки могут использоваться совместно: например, чтение видео с помощью OpenCV, а обработка и визуализация — с помощью scikit-image и matplotlib. Это часто используется в практических и исследовательских проектах.