matlab - opencv和matlab之间的像素值不同

标签 matlab opencv image-processing pixel

当我在 matlab 中使用“显示”函数显示图像的像素值(转换为灰度的 RGB 图像)时,我发现像素值小于 1(所有值都在 0 和 1 之间)。而当我在 opencv 中做同样的事情时,我得到了更高的值(value)。为什么会发生值(value)观的变化?
打开CV代码和matlab代码如下:

for (int i = 0; i < img1.rows; i++)
{
    for (int j = 0; j < img1.cols; j++)
    {
        cout << (unsigned int)img1.at<uchar>(i, j) << endl;
    }
}

Matlab code:

gI=rgb2gray(I);
imshow(gI);

最佳答案

很抱歉让你失望了。
没有人保证将 RGB 转换为灰度会产生相同的结果。有2个原因

  • 转换不是数学上的正确公式,而是主观问题。在过去 50 年的过程中,编写了一些不同的标准(主要用于支持灰度信号的彩色电视),以说明如何将 RGB 转换为灰度级。不同的标准导致几乎相同的可见结果,尽管像素的实际值略有不同(约 0.2%)。您可以在 Wikipedia 中阅读有关标准的更多信息。例如:一种标准定义了RGB到灰度的转换,另一种定义了RGB到YUV的转换,并以Y channel 为灰度。其他标准也很少(保持亮度、强度、对比度等)。由于标准的偏好随时间而变化,因此很难知道 RGB 到灰色的具体实现方式。 Here是 3 种不同方法的示例。 Open CV 使用完全不同的方法( 0.299f*RED + 0.587f*GREEN + 0.114f*BLUE Here ),而 Matlab 使用另一种方法(0.2989*RED + 0.587*GREEN + 0.1140*BLUE. Here )。注意 openCV 0.299 和 Matlabs 0.2989 之间的区别。
    更多信息可以在这个答案中找到(here)
  • 第二个原因 - 跨硬件和软件的不同浮点表示。浮点计算(无论是 double 还是浮点)并不精确,并且取决于您使用的特定硬件、编译器类型以及您构建软件和特定编译器指令。相同的数学计算在不同的计算机上甚至在同一台计算机上的两个不同程序中可能会产生略微不同的结果。所以不幸的是,对于 RGB 到灰色的转换,您不会得到完全相同的结果,但是如果您将值四舍五入到 [0..255] 的范围内,您通常会得到不超过 2 个级别的差异。我想说的是,在 99.9% 像素中,您将获得相同的值,而在其他像素中,差异为 1。2 非常罕见,我从未见过差异为 3,除非您进行很少的顺序转换,例如 RGB->XYZ->HSV ->YUV
  • 关于matlab - opencv和matlab之间的像素值不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31045115/

    相关文章:

    python - 使用图像处理检测近水平线

    matlab - 如何在 MATLAB 中去除图像的彩色背景

    matlab - 使用 Matlab 在 Excel 中创建命名范围

    debugging - 有什么方法可以使用 Matlab Debugger 调试已编译的组件吗?

    function - 将 varargin 解包为单个变量

    C++ OpenCV 使用 vector<Point> 作为矩阵的索引

    image - 如何选择图像插值方法? (Emgu/OpenCV)

    c++ - 如何在 Tensorflow 中获取 dropout mask

    opencv - 查找图像中最大的 blob

    python - 如何查找和测量图像中的弧长