skimage.io.imread 与 cv2.imread

Ara*_*san 5 python opencv numpy histogram scikit-image

我正在使用并且熟悉cv2,今天我正在尝试使用skimage

我试图使用 skimage和读取图像cv2。看来他们都完美地解读了图像。但是,当我绘制图像的直方图但读取不同的库(skimagecv2)时,直方图显示出显着差异。

有人可以帮助我解释直方图之间的区别吗?

我的代码:

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()

Run Code Online (Sandbox Code Playgroud)

文本输出:

(512, 512)
(512, 512)

输出:

代码输出



编辑:

这是输入图像:

小智 5

这两个imread函数只是读取图像的默认格式不同。标准skimage.io使用的是 64 位浮点数,而cv2标准似乎是无符号字节。
您可以通过转换img1为无符号字节格式来看到这一点。

import skimage as skk
img1 = skk.img_as_ubyte(img1)
Run Code Online (Sandbox Code Playgroud)

现在您将得到一些相似的直方图。它们并不完全相同,因为它们最初被读取为不同的格式。

图像