OpenCV vs Matlab:使用 imread 的像素值不同
OpenCV vs Matlab : Different Values on pixels with imread
我在 Windows 7 的 Matlab (2014) 和 OpenCV (3.0) 中使用 jpg 文件时遇到函数 imread()
的问题。
读取相同的文件jpg和相同的像素,我没有相同的值。
这是我的 2 个代码:(OpenCV 代码后跟 Matlab 代码)和我拥有的值(在 OpenCV 中查看模式调试,在 Matlab 中查看键盘)
#include <opencv2\opencv.hpp>
#include <cstdio>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("test.jpg");
uchar pb = img.at<Vec3b>(0, 0).val[0];
uchar pg = img.at<Vec3b>(0, 0).val[1];
uchar pr = img.at<Vec3b>(0, 0).val[2];
int d = img.depth();
int t = img.type();
}
值:
pixel [0,0] = (147,174,204); // = index(1,1) in the image.
d = 0;
t = 16;
Matlab 代码:
img = imread('test.jpg');
img(1,1,:)
whos img
值:
ans(:,:,1) =
148
ans(:,:,2) =
174
ans(:,:,3) =
201
Name Size Bytes Class Attributes
img 1920x2560x3 14745600 uint8
您知道为什么值不同吗?
我在另一个 post 上看到过这样的问题,但是这个人通过阅读 tiff 没有同样的深度。在这里你可以看到我有相同的深度!
在此先感谢您,对于任何英文错误,我们深表歉意。
PS:我也用其他像素进行了测试,结果相同:关闭结果但不完全相等。
此代码为您的示例图片提供了正确的值 test2.jpg
:
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
int main()
{
auto img = cv::imread("test2.jpg");
auto pixel = img.at<cv::Vec3b>(85, 85);
std::cout << (int)pixel[0] << "\t" << (int)pixel[1]
<< "\t" << (int)pixel[2] << std::endl;
}
输出:
118 105 91
这里的OpenCV版本是2.4.10。使用您的代码时,我得到了相同的结果。
我想某个地方有一个超出你影响范围的错误。
对于阅读此主题的人,这是最终解释:
来自libjpeg版本。版本 6b(OpenCV 在 2.4.11 之前使用该版本)与 Matlab 2014b 的工作方式相同。从 libjpeg 版本 8 开始,我得到了上面提到的其他结果。
为了解决我的问题(我使用了一些不同的图像和背景来创建一个蒙版,我的问题是我使用 OpenCV(没有 libjeg 版本 6b)在图像中有一些雪),我使用 libjpeg 6b 编译了 OpenCV 3.0 .(我还必须导入 2 个运行时库并将其放入我的项目中,可在网上免费找到)。
我没有报告 OpenCV 上的错误。老实说,我没有管理,即使我尝试了也不知道如何在他们的网站上做...
我在 Windows 7 的 Matlab (2014) 和 OpenCV (3.0) 中使用 jpg 文件时遇到函数 imread()
的问题。
读取相同的文件jpg和相同的像素,我没有相同的值。
这是我的 2 个代码:(OpenCV 代码后跟 Matlab 代码)和我拥有的值(在 OpenCV 中查看模式调试,在 Matlab 中查看键盘)
#include <opencv2\opencv.hpp>
#include <cstdio>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("test.jpg");
uchar pb = img.at<Vec3b>(0, 0).val[0];
uchar pg = img.at<Vec3b>(0, 0).val[1];
uchar pr = img.at<Vec3b>(0, 0).val[2];
int d = img.depth();
int t = img.type();
}
值:
pixel [0,0] = (147,174,204); // = index(1,1) in the image.
d = 0;
t = 16;
Matlab 代码:
img = imread('test.jpg');
img(1,1,:)
whos img
值:
ans(:,:,1) =
148
ans(:,:,2) =
174
ans(:,:,3) =
201
Name Size Bytes Class Attributes
img 1920x2560x3 14745600 uint8
您知道为什么值不同吗?
我在另一个 post 上看到过这样的问题,但是这个人通过阅读 tiff 没有同样的深度。在这里你可以看到我有相同的深度!
在此先感谢您,对于任何英文错误,我们深表歉意。
PS:我也用其他像素进行了测试,结果相同:关闭结果但不完全相等。
此代码为您的示例图片提供了正确的值 test2.jpg
:
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
int main()
{
auto img = cv::imread("test2.jpg");
auto pixel = img.at<cv::Vec3b>(85, 85);
std::cout << (int)pixel[0] << "\t" << (int)pixel[1]
<< "\t" << (int)pixel[2] << std::endl;
}
输出:
118 105 91
这里的OpenCV版本是2.4.10。使用您的代码时,我得到了相同的结果。 我想某个地方有一个超出你影响范围的错误。
对于阅读此主题的人,这是最终解释:
来自libjpeg版本。版本 6b(OpenCV 在 2.4.11 之前使用该版本)与 Matlab 2014b 的工作方式相同。从 libjpeg 版本 8 开始,我得到了上面提到的其他结果。
为了解决我的问题(我使用了一些不同的图像和背景来创建一个蒙版,我的问题是我使用 OpenCV(没有 libjeg 版本 6b)在图像中有一些雪),我使用 libjpeg 6b 编译了 OpenCV 3.0 .(我还必须导入 2 个运行时库并将其放入我的项目中,可在网上免费找到)。
我没有报告 OpenCV 上的错误。老实说,我没有管理,即使我尝试了也不知道如何在他们的网站上做...