Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python skimage.io.imread与cv2.imread_Python_Numpy_Histogram_Scikit Image_Cv2 - Fatal编程技术网

Python skimage.io.imread与cv2.imread

Python skimage.io.imread与cv2.imread,python,numpy,histogram,scikit-image,cv2,Python,Numpy,Histogram,Scikit Image,Cv2,我正在使用并熟悉cv2,今天我尝试了skimage 我试着用skimage和cv2读取图像。看来他们两人都能很好地解读这幅图像。但当我绘制图像的直方图,但通过不同的库(skimage和cv2)读取时,直方图显示出显著的差异 有人能帮我解释一下直方图之间的区别吗 我的代码: (512, 512) (512, 512) 导入cv2 将skimage.io作为sk导入 将numpy作为np导入 将matplotlib.pyplot作为plt导入 path='../img/lenna.png' img1

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

我试着用
skimage
cv2
读取图像。看来他们两人都能很好地解读这幅图像。但当我绘制图像的直方图,但通过不同的库(
skimage
cv2
)读取时,直方图显示出显著的差异

有人能帮我解释一下直方图之间的区别吗

我的代码:

(512, 512) (512, 512)
导入cv2
将skimage.io作为sk导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
path='../img/lenna.png'
img1=sk.imread(路径,真)
img2=cv2.imread(路径,cv2.imread\U灰度)
打印(img1.shape)
打印(img2.shape)
plt.子地块(2,2,1)
plt.imshow(img1,cmap='gray')
plt.title(‘略读’)
plt.xticks([])
plt.yticks([])
plt.子地块(2,2,2)
plt.imshow(img2,cmap='gray')
产品名称(“cv2已读”)
plt.xticks([])
plt.yticks([])
plt.子地块(2、2、3)
h=np.直方图(img1,100)
plt.plot(h[0])
plt.title(‘略读直方图’)
plt.子地块(2、2、4)
h=np.直方图(img2,100)
plt.plot(h[0])
打印标题(“cv2读取直方图”)
plt.show()
文本输出:

(512, 512) (512, 512) (512, 512) (512, 512) 输出:

(512, 512) (512, 512)



编辑:

(512, 512) (512, 512) 以下是输入图像:


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

import skimage as skk
img1 = skk.img_as_ubyte(img1)
现在你会得到一些相似的柱状图。它们并不完全相同,因为它们最初是以不同的格式读取的


您是否能够打印两幅图像的
np.mean()
np.std()
,以便我们查看差异是在加载和灰度转换还是在直方图生成和显示方面?此外,如果你分享你使用的真实Lena图像,这也会有所帮助。你应该注意到OpenCV和skimage使用了一种根本不同的图像表示方式。OpenCV倾向于使用[0..255]范围内的8位无符号整数,skimage倾向于使用[0..1]范围内的浮点。非常感谢。正如你提到的,强度范围的差异是原因,我已经理解了。这里是
np.mean
np.std
,它们告诉了我们很多<代码>浏览平均值:0.4578778306070963浏览标准:0.1938036734500247 cv2平均值:123.54518127441406 cv2标准:47.853738824592234非常感谢。我想我已经明白原因了。到目前为止有一个区别,不是因为转换时的精度损失吗?是的,也是这样。当读取为无符号字节(在OpenCV的情况下)或将(如上所示)转换为无符号字节时,您总是会丢失一些精度。不同之处在于如何失去精度。在OpenCV的情况下,您将失去精度,因为您试图将.png文件格式表示为字节数组。在scikt中使用
img\u as\u ubyte
进行转换的情况下,您将失去精度,因为您正在从浮点转换为字节。希望这能让事情变得更清楚。只想了解一下.png格式的外观: