обрезать ненужное черное пространство изображения

У меня есть набор изображений в градациях серого, например:

введите описание изображения здесь

Это пример изображения, так как я не могу опубликовать исходное изображение. Каждое изображение имеет область с текстурой, чистый белый водяной знак (поз.) И много нежелательного черного пространства.

В идеале это изображение должно быть обрезано до:

введите описание изображения здесь

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

Картинки могут выглядеть по-разному, вот еще один пример

введите описание изображения здесь

это нужно только обрезать слева

введите описание изображения здесь

другой:

введите описание изображения здесь

это нужно обрезать сверху и снизу:

введите описание изображения здесь

и еще один

введите описание изображения здесь

этот нужно обрезать сверху и справа. Обратите внимание, что на этой картинке я оставил водяной знак. В идеале водяной знак тоже должен быть удален, но я думаю, что без него проще.

вот изображение водяного знака, как он выглядит на самом деле.

введите описание изображения здесь

Изображения различаются по размеру, но обычно большие (более 2000x2000).

Я ищу решение на python (возможно, cv2).

моей первой идеей было использовать что-то вроде этого: Python и OpenCV: второй по величине объект

но этот код решения не подходит для меня


person spore234    schedule 28.01.2017    source источник
comment
Посмотрите здесь ... stackoverflow.com/a/41761313/2836621   -  person Mark Setchell    schedule 28.01.2017
comment
Покажи, что ты сделал до сих пор.   -  person miindlek    schedule 28.01.2017
comment
@MarkSetchell благодарит Марка, ваше решение отличное и работает, но теперь я понял, что мне нужна обработка изображений на лету, и это нужно делать на python.   -  person spore234    schedule 28.01.2017
comment
использовать порог (+ возможно расширение + размывание) + выделение контура + ограничивающая рамка самого большого контура + создание субизображения этого самого большого ограничивающего прямоугольника контура.   -  person Micka    schedule 29.01.2017


Ответы (1)


Я работаю на C # и C ++ и не работаю на python, но могу подсказать вам логику.

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

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

Теперь мы не можем просто так легко удалить строки и столбцы, поэтому просто запишите избыточные строки и столбцы, а затем вы можете обрезать свое изображение, используя следующий код: (Я буду писать код на C # с библиотекой emgucv, но это легко понять для python)

Mat original_image = new Mat();
Rect ROI = new Rect(x,y,width,height);
Mat image_needed_to_crop = new Mat(original_image,ROI);

Этот код просто извлекает из исходного изображения только интересующую область.

person RAJ KUMAR MISHRA    schedule 04.02.2017