skimage.io.imread Versus cv2.imread - PullRequest
       40

skimage.io.imread Versus cv2.imread

0 голосов
/ 22 января 2020

Я использую и знаком с cv2, сегодня я давал попытку с skimage.

Я пытался прочитать изображение, используя skimage и cv2. Кажется, они оба отлично читают изображение. Но когда я строю гистограммы изображения, но читаю через разные библиотеки (skimage и cv2), гистограмма показывает существенную разницу.

Кто-нибудь мне поможет, объяснив разницу между гистограммами?

Мой код:

import cv2
import skimage.io as sk
import numpy as np
import matplotlib.pyplot as plt

path = '../../img/lenna.png'

img1 = sk.imread(path, True)
img2 = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
print(img1.shape)
print(img2.shape)

plt.subplot(2, 2, 1)
plt.imshow(img1, cmap='gray')
plt.title('skimage read')
plt.xticks([])
plt.yticks([])

plt.subplot(2, 2, 2)
plt.imshow(img2, cmap='gray')
plt.title('cv2 read')
plt.xticks([])
plt.yticks([])

plt.subplot(2, 2, 3)
h = np.histogram(img1, 100)
plt.plot(h[0])
plt.title('skimage read histogram')

plt.subplot(2, 2, 4)
h = np.histogram(img2, 100)
plt.plot(h[0])
plt.title('cv2 read histogram')

plt.show()

Вывод текста:

(512, 512)
(512, 512)

Вывод:

code output



Редактировать:

Вот входное изображение:

image

1 Ответ

1 голос
/ 22 января 2020

Две функции imread имеют разный формат по умолчанию для чтения изображений. Стандарт skimage.io использует 64-разрядное число с плавающей запятой, в то время как стандарт cv2 выглядит как байт без знака.
Это можно увидеть, преобразовав img1 в формат байта без знака.

import skimage as skk
img1 = skk.img_as_ubyte(img1)

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

img

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