Как сделать так, чтобы затененная часть фона считалась фоном (рисунок ниже) с помощью OpenCV в Python?

Я очень новичок в OpenCV (и в StackOverflow). Я пишу программу с OpenCV, которая делает снимок с объектом (например, ручкой (рис, телефон), положенной на бумагу) и вычисляет сколько процентов составляет объект от изображения.

Проблема, с которой я сталкиваюсь, заключается в том, что на пороговом изображении (попробовал адаптивное и otsu) фото немного затенено по краям:

Исходное изображение

Результат изображения

И вот мой код:

import cv2

img = cv2.imread("image.png")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
b,g,r = cv2.split(img)

th, thresh = cv2.threshold(b, 100, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imwrite("image_bl_wh.png", thresh)

Пробовал размытие и морфологию, но не смог.

Как я могу заставить свою программу считать черные части вокруг изображения фоном, и есть ли более лучший и простой способ сделать это?

P.S. Извините за мои грамматические ошибки в английском.


person frixaco    schedule 08.11.2018    source источник


Ответы (1)


Это не программное решение, но когда вы выполняете автоматический визуальный контроль, это первое, что вы должны попробовать: Улучшите свои настройки. Изображение просто темнее по краям, поэтому увеличьте яркость при записи. изображения должны помочь.

Если это не вариант, вы можете рассмотреть возможность использования пустого изображения для сравнения. То, что вы пытаетесь сделать, - это сегментация фона, и есть лучшие способы, чем простое пороговое значение цвета, но они обычно требуют хотя бы одного изображения фона или нескольких изображений.

Если вам нужно только программное решение, вам следует попробовать детектор краев в сочетании с морфологическими операторами.

person Pumpkin    schedule 08.11.2018
comment
Спасибо. Научился использовать гамма-коррекцию, и это мне помогло. - person frixaco; 15.11.2018