Метод порогового отса Оцу, создающий "плащаницу"

Я пытаюсь портировать изображение, используя метод Оцу в Opencv:

ввод-изображения

Хотя, когда я порождаю его, некоторые части изображения полностью окружены белым цветом и создаются и заканчиваются в Opencv, не обнаруживая все контуры в изображении. Это то, что я получаю, когда делаю пороговое определение метода Оцу, используяret,thresh=cv2.threshold(blurred,0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU):

пороговая-The-изображения

РЕДАКТИРОВАТЬ: Некоторые люди просили код, который я использую, поэтому вот оно:

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

cv2.imshow('Input Image', image)
cv2.waitKey(0)

blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.adaptiveThreshold(blurred,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
                               cv2.THRESH_BINARY_INV,81,2)
#ret, thresh = cv2.threshold(blurred,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
#thresh_value = 70
#ret,thresh= cv2.threshold(blurred,thresh_value,255,cv2.THRESH_BINARY)

Теперь он делает некоторый клетчатый шум: WOAH

2 ответа

Решение

Вам не нужно вручную искать сладкое место! Пусть OpenCV сделает это за вас!

OpenCV имеет алгоритм адаптивного порога именно от таких проблем, который называется adaptiveThreshold

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

Попробуй это:

th3 = cv.adaptiveThreshold(blurred,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
        cv.THRESH_BINARY,11,2)

Обновление: функции, подобные этим, не работают идеально из коробки. Если он все еще создает артефакты, такие как шум соли и перца, вы можете попробовать:

  • Значительно увеличивая blockSize, Это может гарантировать, что у каждого блока есть буква внутри, что, будем надеяться, будет лучше выбирать порог. (например, разделив изображение на 25 блоки вместо 100, blocksize из 11 пикселей очень мало.)
  • Сначала примените фильтр размытия, чтобы ослабить плохие пятна, создающие приправленный шум. (С названием изображения blurry Я полагаю, что вы уже сделали это.
  • Сначала простая пороговая функция, которая просто удаляет некоторые шумы. Например, установка всех пикселей выше 5 и ниже 100 равными нулю. Затем после этого примените adaptiveThreshold,
  • Следуйте советам @Mark, вычитая размытое изображение из исходного изображения. (См. Эту тему)

Надеюсь, это поможет!

Вместо того, чтобы использовать метод Оцу, попробуйте глобальный метод порогового значения.

thresh_value = 50
ret,thresh= cv2.threshold(blurred,thresh_value,255,cv2.THRESH_BINARY)

изменить thresh_value Параметр, пока вы не получите желаемый результат.

Чтобы узнать больше о методах пороговых значений, пожалуйста, обратитесь к документации.

Другие вопросы по тегам