【发布时间】:2020-05-08 08:54:04
【问题描述】:
我使用并熟悉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)输出:
编辑:
这是输入图像:
【问题讨论】:
-
能否打印
np.mean()和np.std()这两个图像,以便我们查看差异是在加载和灰度转换还是在直方图的生成和显示中?此外,如果您分享您使用的实际 Lena 图像会有所帮助。 -
您应该注意 OpenCV 和 skimage 使用完全不同的图像表示。 OpenCV 倾向于使用 [0..255] 范围内的 8 位无符号整数,而 skimage 倾向于使用 [0..1] 范围内的浮点数。
-
非常感谢。正如您所提到的,强度范围差异是原因,我已经理解了。这是
np.mean和np.std,他们说了很多。skimage mean: 0.4578778306070963 skimage std: 0.19380367354500247 cv2 mean: 123.54518127441406 cv2 std: 47.853738824592234
标签: python numpy histogram scikit-image cv2