гамма-коррекция для изображений с более светлым фоном - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь определить границы удостоверения личности на изображении, используя код ниже. Ключом является значение гаммы, которое я использую. Я использую значение 2 или 3 (учитывая, что я хочу, чтобы карта выделялась на фоне). Я столкнулся с проблемой при использовании фотографий с более светлым фоном или таким же светлым, как сам цвет карты. Пожалуйста, посмотрите на изображения ниже ... первое - это оригинал с темным b / g, а второе - с гамма-коррекцией ... то же самое со следующими 2. Я в своем уме, пытаясь понять, как я мог обрабатывать фото с более светлым фоном. Также вставка кода, который я использую для выполнения гамма-коррекции. Пожалуйста, дайте мне знать, если вы, ребята, можете направить мою толстую голову в правильном направлении:)

import cv2
import numpy as np
import imutils
import math
import sys

img = cv2.imread( sys.argv[1] )
gray1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
invGamma = 3.0
table = np.array([((i / 255.0) ** invGamma) * 255
for i in np.arange(0, 256)]).astype("uint8")

gray = cv2.LUT(gray1, table)
ret,thresh1 = cv2.threshold( gray, 80, 255, cv2.THRESH_BINARY )
cv2.imwrite( 'LUT.jpg', thresh1 )
_, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

Image1

Image1-Gamma-corrected-3

Image2

Image2-Gamma-3

1 Ответ

0 голосов
/ 30 апреля 2019

насколько я понимаю ваш вопрос, вы в основном пытаетесь обнаружить края карты? Или вы пытаетесь полностью отделить карту (т.е. вырезать) от изображения?

Использование гаммы просто меняет видимый контраст всего изображения после преобразования его в серый. OpenCV имеет множество собственных процедур обнаружения краев и объектов, так как я предполагаю, что вы пытаетесь выполнить предварительную обработку, чтобы помочь?

A КОНЦЕПЦИИ (не код) ОТВЕТ:

ОТДЕЛЬНЫЕ КАНАЛЫ

Позвольте мне указать вам другое направление. Если входные изображения всегда цветные, рассмотрите возможность использования только одного из трех цветовых каналов RGB. Вот пример:

КРАСНЫЙ КАНАЛ:

RedChannelOnly

ЗЕЛЕНЫЙ КАНАЛ:

BlueChannelOnly

СИНИЙ КАНАЛ:

enter image description here

Обратите внимание, насколько больше контраст у синего канала относительно красного канала. В зависимости от содержимого изображения, вы обычно обнаружите, что один канал имеет лучшее разделение для нужного объекта.

Если вы посмотрите на гистограмму:

Histogram

Вы можете видеть, что синий канал имеет наибольшее расстояние между пиками справа (желаемый объект) и левым пиком (яркое пятно на столе). Но в красном канале все сгруппировано посередине.

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

Вы также можете определить, какой цветовой канал имеет свою вершину, самую дальнюю от того же пика в другом канале, а затем СУБТРАКТИТЬ или использовать РАЗНИЦУ или РАЗДЕЛИТЬ два канала (пример этого приведен ниже в разделе «Канальная математика»).


Скатерть

Теперь у скатерти очень контрастный рисунок: белый (серый) светлее идентификационной карты и зеленый - темнее карты. Карта в основном между.

Используя инструмент кривых из графического редактора для предоставления графического примера, вы можете увидеть, что, закрепив нижний И верхний уровни на черном, вы можете изолировать среднюю карту.

Но опять же обратите внимание на гистограмму:

Histogram

В то время как в средних значениях сгущается почти все, КРАСНЫЙ канал имеет небольшой пик около черного. Используя это в качестве руководства, мы отключаем зеленый и синий каналы, а затем значения CLAMP ниже и значения выше диапазона значения карты.

Изогнутый инструмент:

Curves

И затем только результирующий красный канал - обратите внимание, что он инвертирован, чтобы сделать результирующий контраст более четким:

Inverted Red Only


* * 1 089 * 1090 СУЩНОСТЬ *

Таким образом, суть этих концепций изоляции заключается в

  1. Изучите каждый цветовой канал, чтобы определить, какой из них имеет лучший контраст. Это будет искать пик, который больше всего отличается от других каналов И / ИЛИ ищет пики в канале с самой широкой «долиной» между ними.
  2. Зафиксируйте низкие и высокие значения, чтобы изолировать нужный объект. Это будет использовать пики, найденные в A, с порогом, чтобы определить точки, которые нужно закрепить и нарастить до нужного изображения.

Проблема только с использованием общей настройки «гаммы» заключается в том, что вы будете перетаскивать все изображение вокруг, чтобы изменить кажущийся контраст, когда то, что вы действительно пытаетесь сделать, это устранить (зажать) части изображения, которые не актуальны.

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


БОНУС: УДОВОЛЬСТВИЕ С КАНАЛЬНОЙ МАТЕЙЦЕЙ

Это может иметь или не иметь полезности для вас, но умножение, деление, вычитание, различие, исключение между цветовыми каналами иногда может помочь избавиться от нежелательных фоновых объектов. Возьмите скатерть и узор.

Позволяет умножить ЗЕЛЕНЫЙ и СИНИЙ каналы и получить ЭТО:

Multiply Green and Blue

Теперь можно разделить по КРАСНОМУ каналу

Divide by Red Divide

Теперь настройте ГАММУ КРАСНОГО канала, чтобы устранить скатерть (Гамма, отрегулированная на 1,57):

Gamma Adjusted to 1.57

С этим результирующим изображением:

Final

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

...