在opencv中规范化图像

Posted

技术标签:

【中文标题】在opencv中规范化图像【英文标题】:Normalising an image in opencv 【发布时间】:2015-06-25 12:09:34 【问题描述】:

我有一个 RGB 图像存储在 Mat 数据结构中。我正在使用 opencv 中的 cvtColor 函数将图像转换为灰度。之后,我尝试将图像标准化为 [0,1] 范围。我正在使用 opencv 的默认归一化功能。为了检查正确性,我尝试打印像素值并将其与 matlab 值等同(Matlab 值已经在 [0,1] 范围内)。但是价值观相差很大。帮助我使两个结果几乎相同。下面是opencv和matlab代码。

Mat img1 = imread("D:/input.png", CV_LOAD_IMAGE_COLOR);
cvtColor(img1, img1, CV_BGR2GRAY);
img1.convertTo(img1, CV_32FC1);
cv::normalize(img1, img1, 0.0, 1.0, NORM_MINMAX, CV_32FC1);
for (int i = 0; i < img1.rows; i++)

    for (int j = 0; j < img1.cols; j++)
    
       cout << img1.at<float>(i, j) << endl;
    

Matlab 代码:

 I=im2double(imread('input.png'));
 gI=rgb2gray(I);
 display(gI)

【问题讨论】:

为什么不使用convertTo 为您进行缩放? cv::convertTo( img1, CV_32FC1, 1/255.0 ); 我也试过了。值仍然不匹配。 你能把Matlab代码也贴出来吗? @BrianL,我也发布了 matlab 代码。 【参考方案1】:

我认为您不想在这里正常化。 Matlab 转换 rgb2gray 使用这个等式:0.2989 * R + 0.5870 * G + 0.1140 * B。因此,不要期望输出灰度图像中的最小值为 0.0 或最大值为 1.0。如果您有纯白色 (255,255,255) 和纯黑色 (0,0,0) 像素,您只会期望 0 和 1。

试试这个:

img *= 1./255;
cvtColor(img, img, CV_BGR2GRAY);

【讨论】:

以上是关于在opencv中规范化图像的主要内容,如果未能解决你的问题,请参考以下文章

规范化0到1之间的像素值

在 OpenCV C++ 中为 OCR 规范化车牌

如何将图像中所有文本的强度(暗度)提高到一个级别?

如何使函数可以在 OpenCV 中处理不同类型的图像

Java 图像规范化

规范化 tf.data.Dataset