opencv和matlab之间的像素值不同



当我在matlab中使用"display"函数显示图像(转换为灰度的RGB图像)的像素值时,我发现像素值小于1(所有值都在0和1之间)。而当我在opencv中做同样的事情时,我得到了更高的价值。为什么价值观会发生变化?打开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到灰度的转换会产生相同的结果。有两个原因

  1. 转换不是一个数学上正确的公式,而是一个主观的问题。在过去的50年里,关于如何将RGB转换为灰度级,制定了一些不同的标准(主要针对支持灰度信号的彩色电视)。不同的标准会产生几乎相同的可见结果,尽管像素的实际值有点不同(大约0.2%)。你可以在维基百科上阅读更多关于这些标准的信息。例如:一个标准定义RGB到灰度的转换,而另一个标准则定义RGB到YUV的转换,并以Y通道为灰度。几乎没有其他标准(保持亮度、强度、对比度等)。由于标准的偏好会随着时间的推移而变化,因此很难知道RGB到灰度的具体实现方式。以下是3种不同方法的示例。Open CV使用完全不同的方法(此处为0.299f*RED + 0.587f*GREEN + 0.114f*BLUE),而Matlab使用另一种方法(0.2989*RED+0.587*GREEN+0.1140*BLUE。此处)。请注意openCV 0.299和Matlabs 0.2989之间的差异。更多信息可以在这个答案中找到(这里)
  2. 第二个原因——硬件和软件的浮点表示方式不同。浮点计算(无论是双精度还是浮点)并不精确,取决于您使用的特定硬件、用于构建软件的编译器类型和特定的编译器指令。相同的数学计算在不同的计算机上,甚至在同一台计算机上的两个不同程序中,可以产生略有不同的结果。因此,不幸的是,RGB到灰度转换不会得到完全相同的结果,但如果将值四舍五入到[0.255]的范围,通常会得到不超过2级的差异。我想说,在99.9%的像素中,你会得到相同的值,而在其他像素中,差值为1。2是非常罕见的,我从来没有见过3的差异,除非你做一些顺序转换,比如RGB->XYZ->HSV->YUV

我的垫子是8UC3型的。如何转换的标准化双值MATLAB到8UC3?仅乘以255就足够了吗?


8UC3字节的情况下,就足以乘以255。它们就是这样设计的。8UC中的3表示三个通道红色绿色蓝色

无论如何,在0 to 255范围值和0.0 to 1.0范围值之间转换

//Psuedo-code formula:
col_val = 210; //range 0-255
normalised = col_val / 255; //always divide by 255 for a normalised to "1.0" version
normal_reverse_to255 = normalised * 255; //make it back into "0 to 255" range

预期结果:
col_val=210 //original value before normalised
归一化=0.8235 //...294117647058 etc etc //after normalised to 0.0 to 1.0 range
normal_reverse_to255=210;//multiply result is same as original value

希望这对你有帮助。

编辑:
我刚刚意识到你正在使用gI=rgb2gray(I);来获得你的灰度图像

尝试以下操作:
cvtColor(src,dst,CV_GRAY2RGB);从此应答被劫持

相关内容

  • 没有找到相关文章

最新更新