Прочитать изображение в формате png с помощью cv2.imread формы Opencv3 в Python3.7.1 и без пикселя вообще с черным окном - PullRequest
2 голосов
/ 22 марта 2019

У меня есть два изображения png, одно выводится подушкой библиотеки питона в png, конвертируется из изображения шрифта svg, другое это чтение и повторное сохранение из windows 10 программа рисования в png.

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

Как правильно читать эти pngs?

КОД:

import cv2

image_file_path = r""
image = cv2.imread(image_file_path, cv2.IMREAD_ANYDEPTH)

if(! os.path.exists(image_file_path)):
    print('NOT EXIST! = ' + image_file_path)

cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image", image)
cv2.waitKey()

ИЗОБРАЖЕНИЙ:

OK: enter image description here

НЕ ОК: enter image description here

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Первое изображение в 4-канальном формате RGBA с совершенно бессмысленным, полностью непрозрачным альфа-каналом, который вы можете игнорировать.

Второе изображение в 2-канальном формате Grey + Alpha, где все пиксели чисто черного цвета, а формы определены только в альфа-канале.

Итак, в основном вы хотите:

  • удалить последний канал первого изображения, что можно сделать с помощью cv2.IMREAD_COLOR

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

    im = cv2.imread('2.png',cv2.IMREAD_UNCHANGED)[:,:,-1]


Я получил вышеуказанную информацию с помощью ImageMagick , который входит в большинство дистрибутивов Linux и доступен в macOS и Windows.

Команда, которую я использовал в Терминале:

magick identify -verbose 2.png

Пример вывода

Image: 2.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 1040x1533+0+0
  Units: Undefined
  Colorspace: Gray
  Type: Bilevel
  Base type: Undefined
  Endianess: Undefined
  Depth: 8-bit
  Channel depth:
    Gray: 1-bit                     <--- Note 1
    Alpha: 8-bit                    <--- Note 1
  Channel statistics:
    Pixels: 1594320
    Gray:
      min: 0  (0)                   <--- Note 2
      max: 0 (0)                    <--- Note 2
      mean: 0 (0)
      standard deviation: 0 (0)
      kurtosis: -3
      skewness: 0
      entropy: 4.82164e-05
    Alpha:
      min: 0  (0)                   <--- Note 3
      max: 255 (1)                  <--- Note 3
      mean: 50.3212 (0.197338)
      standard deviation: 101.351 (0.397456)
      kurtosis: 0.316613
      skewness: 1.52096
      entropy: 0.0954769
    ...
    ...

Я пометил стрелками и примечаниями справа вверху.

Примечание 1: Это говорит о том, что изображение серого цвета + альфа

Примечание 2. Это говорит о том, что все пиксели в оттенках серого являются черными, поскольку максимум равен нулю, а минимум равен нулю

Примечание 3. Это говорит о том, что есть некоторые полностью прозрачные пиксели и некоторые полностью непрозрачные пиксели

2 голосов
/ 22 марта 2019

Paint трансформирует изображения, делая их формат несовместимым с «типичной» непрочитанной процедурой.Я не уверен, что происходит, это может быть связано с рисованием, уже удаляющим альфа-канал, который OpenCV также хочет удалить (согласно их документам, на код не смотрели).К счастью, вы можете обойти это:

I_not_ok = cv2.imread(ImagePath, CV2.IMREAD_UNCHANGED)

I_ok = I_not_ok[:,:,3]

cv2.namedWindow('Image_ok', cv2.WINDOW_NORMAL)
cv2.imshow('Image_ok', I_ok)
cv2.waitKey(0)
...