Как определить количество каналов в изображении? - PullRequest
0 голосов
/ 24 февраля 2020

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

Итак, я пишу эту программу:

import cv2
import numpy

img = cv2.imread("B2DBy.jpg")
print('No of Channel is: ' + str(img.ndim))

cv2.imshow("Channel", img)
cv2.waitKey()

Но она дает то же самое результаты трех каналов для всех типов изображений? Я прочитал этот вопрос, но он выдает ошибку:

img = cv2.imread("B2DBy.jpg", CV_LOAD_IMAGE_UNCHANGED)
NameError: name 'CV_LOAD_IMAGE_UNCHANGED' is not defined

Итак, мой вопрос: это правильный способ увидеть количество каналов? ? Или, так или иначе, я все время вводил трехканальные изображения, и таким образом он дает трехканальный выход?

Мои входные данные:

Thermal Image

Gray sacle Image

Binary Image

RGB Image

Ответы [ 3 ]

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

Правильный параметр в вашем cv2.imread должен быть:

img = cv2.imread('path/to/your/image', cv2.IMREAD_UNCHANGED)

Давайте теперь посмотрим на ваши изображения. Я использую команду ImageJ Show Info..., а также следующий код Python с OpenCV и Подушка :

import cv2
from PIL import Image

img_pil = Image.open('path/to/your/image')
print('Pillow: ', img_pil.mode, img_pil.size)

img = cv2.imread('path/to/your/image', cv2.IMREAD_UNCHANGED)
print('OpenCV: ', img.shape)

Первое изображение (карта глубины)

Pillow:  RGB (640, 512)
OpenCV:  (512, 640, 3)

ImageJ также говорит, что это RGB-изображение. Так что, скорее всего, ваша карта глубины была просто сохранена как RGB png.

Второе изображение (собака)

Pillow:  RGB (332, 300)
OpenCV:  (300, 332, 3)

Интересно, ImageJ говорит, что это шкала серого jpg! Я предполагаю, что OpenCV и Pillow просто не поддерживают оттенки серого jpg, хотя, кажется, существует формат оттенков серого jpg .

Третье изображение (знак)

Pillow:  1 (200, 140)
OpenCV:  (140, 200)

И, как говорят Pillow и OpenCV, это изображение в градациях серого, которое также поддерживается ImageJ. Кроме того, Pillow использует здесь режим '1', что отражается в размытом виде изображения.

Четвертое изображение (цвета)

Pillow:  RGB (500, 333)
OpenCV:  (333, 500, 3)

Это всего лишь некоторые RGB изображение; ImageJ также говорит об этом.

Заключение

Да, скорее всего, большинство ваших изображений могут быть просто RGB-изображениями. Тем не менее, использование cv2.IMREAD_UNCHANGED по крайней мере правильно идентифицирует файлы в градациях серого png. Сомнительно, если файлы в градациях серого jpg поддерживаются должным образом.

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

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
OpenCV:      4.2.0
Pillow:      7.0.0
----------------------------------------
1 голос
/ 24 февраля 2020

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

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

image = cv2.imread('gray.jpg', cv2.IMREAD_GRAYSCALE)
image.shape

Если len(img.shape) дает вам три, третий элемент дает вам количество каналов.

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

Я не уверен, что это будет работать, но документация говорит это: cv.LoadImage (имя файла, iscolor = flag) с заданными флагами. Есть флаг «<0», который обозначает «Вернуть загруженное изображение как есть (с альфа-каналом)». Я бы попробовал это: </p>

img = cv2.imread("B2DBy.jpg",iscolor=<0)

или это

img = cv2.imread("B2DBy.jpg",iscolor=CV_LOAD_IMAGE_ANYDEPTH)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...