opencv与matlab中的imread()函数差异

问题背景

今天在做图像分块的时候,为了验证代码的正确性,我用matlab读取了一张图片,并把opencv的分块结果与这张图片的像素点做对比,但是,我发现两者的差异有点大,具体的现象如下图:

图1.cv分块代码结果图
图1.cv分块代码结果图
图2.matlab读取的图片

图2.matlab读取的图片/center>
从图1可以看出。程序是从(0,0),(0,8)两个点作为图像块的左上顶点,把图像分为8x8的块,但是,在对比图2的数据后,发现图2的分块是以列为方向开始的。一开始,我以后是程序出错了,就不断debug找错误,找来找去也没发现什么错,最后,仅有一点可能,
那就是opencv 与matlab读取图像后,储存数据的方式不一样。

简单验证

当我把图像做一次简单的转置,再进行分块时,结果如下图:

图3.转置后cv分块结果

图3.转置后cv分块结果
显然,图像与图1就是一致的了。

两者区别总结:

  1. matlab储存图像是以 RGB的顺序,而CV则是以BGR的顺序储存(这点倒是经常看到)
  2. 两者存储图片的方式正好符合转置关系,也就是说,一张在cv储存的图片,其行向量就是在matlab储存中的列向量。

综上,如果有从matlab转过来cv的小伙伴,一定要小心这些细节,如果自己不清楚这些规则,宁愿多写一些测试代码来测试一下,也不要贪快,现在走的捷径都是以后debug的眼泪啊。

猜你喜欢

转载自blog.csdn.net/qq_33397016/article/details/89791307