Как узнать, создано ли изображение с использованием OpenCV в Python? - PullRequest
0 голосов
/ 16 февраля 2020

Я нахожусь в ситуации, когда мне нужно идентифицировать различные виды ввода, включая файлы, папки, изображения и т. Д. c. В случае изображений мне нужно конкретно знать, создано ли изображение с использованием OpenCV (для факта, что это может быть BGR), или любых других типов изображений.

Я заметил, что изображения, созданные с использованием skimage.io.imread, matplotlib.pyplot.imread и opencvs cv2.imread(), все numpy.ndarray, и я никак не могу различить guish между ними.

Я пытался использовать opencv cv2.cvtColor(img, cv2.COLOR_BGR2RGB) на входном изображении, надеясь, что изображения не-opencv вызовут исключение, и, таким образом, я могу определить, является ли изображение opencvs или нет.

К сожалению, только PIL, изображения терпят неудачу в этом, и оба matplotlib s и skimage s работают нормально (они изменяются с RGB на BGR, так что это тоже не хорошо).

Я пытался найти базовый dtype, но они все одинаковые (uint8). Я попытался найти атрибут, определяющий c для opencv, чтобы другие не могли его получить, поэтому, запросив этот атрибут, я смогу узнать, бесполезно ли это изображение opencv!

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

Обновление:

Использование type(), Я могу различить guish между всеми изображениями, кроме matplotlib с и opencv с. Кажется, я не могу найти способ разнести guish между этими двумя!

Ответы [ 2 ]

3 голосов
/ 16 февраля 2020

После долгого обсуждения ответ ясен. Вопрос, который вы задаете: «Можете ли вы различить guish между изображениями, загруженными с matplotlib и openvc?» нужно ответить без.

0 голосов
/ 18 февраля 2020

TLDR:

Чтобы различать guish между openCV и Matplotlib (а также Skimage), которые все представлены как ndarray с, можно запросить base или flags атрибутов.

Длинное объяснение:

На основании дальнейших исследований я обнаружил, что объекты, созданные с использованием Matplotlib и openCV, различаются в нескольких местах, которые можно использовать для различения sh между ними .
Атрибуты base и flags - это только два таких атрибута, которые можно использовать для поиска, который есть какой.
Среди всех этих методов только openCV ' Атрибут s base равен Нет .
Поэтому можно использовать это, чтобы определить, имеет ли он / она дело с изображением, созданным с использованием openCV s imread или Matplotlibs imread .
Что касается flags attrbiute, только OpenCV владеет данными, вот различные флаги для opencv, Matplotlib, а также Skimage:


In [48]: img_cv.flags
Out[48]:
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

In [49]: img_mtplotlib.flags
Out[49]:
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : False
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

In [50]: img_skimage.flags
Out[50]:
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
  UPDATEIFCOPY : False

Так что, просто проверив OWNDATA, можно решить, идет ли изображение с opencv end! :

if s.flags['OWNDATA'] == True : 
    print('opencv'):
else : 
    ....

на основе этих фактов другие атрибуты, такие как itemset(), доступны только для чтения на Matplotlib стороне, и попытка установить любое значение приведет к исключению ValueError.

второй TLDR:
, поэтому, исходя из потребностей, можно использовать type или эти атрибуты для достижения того, что здесь необходимо.

Важное примечание:
, как правильно заметил @ DanMašek, если объект глубоко скопирован, флаги и база больше не являются надежными, поскольку поля OWNDATA и WRITEABLE будут иметь значение True.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...