使用 Opencv Mat 的可视化像素

Posted

技术标签:

【中文标题】使用 Opencv Mat 的可视化像素【英文标题】:Visualization pixel with Opencv Mat at 【发布时间】:2013-11-20 09:33:33 【问题描述】:

我不明白为什么我运行代码时输出是一个奇怪的数字:

int main(int argc, char** argv)

    Mat im;
    im = imread("lena.png", CV_LOAD_IMAGE_GRAYSCALE);
    cout << im.at<uchar>(0, 0) << endl;
    waitKey(0);

如果我可视化图像,我会看到正确的图像。 我哪里错了?

【问题讨论】:

【参考方案1】:

因为它显示了符号,比如cout &lt;&lt; char(123) &lt;&lt; endl;

你必须使用 int cast:

cout << (int) im.at<uchar>(0, 0) << endl;

【讨论】:

感谢您的回答。我还没有尝试过,但我看到一个非常大的数字,而不是 0 到 255 之间的数字。我不明白这怎么可能。 对不起,我错了。有了你的建议,我得到了正确的价值。非常感谢。 如果有帮助,请批准答案。【参考方案2】:

正如官方documentation 中所述,您不会直接获得实际强度值,而是一个标量。

试试这个:

Scalar intensity = im.at<uchar>(0, 0);

cout << intensity.val[0] << endl;

对于具有多个通道的图像,您可以使用:

Vec3b intensity = im.at<Vec3b>(0, 0);
cout << intensity.val[0] << intensity.val[1] << intensity.val[2] << endl;

【讨论】:

只有一个通道是实际强度。 是的,但只有一个通道和灰色/RGB(A) 颜色空间。一般来说,它不是,这是你必须记住的。 实际上,如果强度是 Vec3b,你可以这样做cout &lt;&lt; intensity &lt;&lt; endl 并得到类似[255, 10, 22]的东西

以上是关于使用 Opencv Mat 的可视化像素的主要内容,如果未能解决你的问题,请参考以下文章

python使用openCV图像加载(转化为灰度图像)平滑图像处理就是将每个像素的值变换为其相邻元素的平均值可视化平滑处理之后的图像(Blurring Images)

用于 OpenCv C++ 中像素像素操作的 Mat 与数组

使用 OpenCV 多通道 Mat 沿通道方向访问像素

OpenCV - 无法访问 Mat 中的所有像素

使用 OpenCV 或 Matplotlib/Pyplot 可视化 MNIST 数据集

C++ OpenCV Mat 像素值和 OpenCV 错误