美文网首页
imshow函数理解

imshow函数理解

作者: 大龙10 | 来源:发表于2023-12-18 13:03 被阅读0次

      使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果。但是,我们经常会发现显示结果和我们预期的结果有些差别。这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我们对图像数据类型之间的转换以及imshow函数理解不够透彻,那么显示结果则不会尽如人意。

    一、imshow函数详解

    对于imshow函数,opencv的官方注释指出:根据图像的深度,imshow函数会自动对其显示灰度值进行缩放,规则如下:

    • 如果图像数据类型是8U(8位无符号),则直接显示。
    • 如果图像数据类型是16U(16位无符号)或32S(32位有符号整数),则imshow函数内部会自动将每个像素值除以256并显示,即将原图像素值的范围由[0- 255*256]映射到[0- 255]
    • 如果图像数据类型是32F(32位浮点数)或64F(64位浮点数),则imshow函数内部会自动将每个像素值乘以255并显示,即将原图像素值的范围由[0- 1]映射到[0- 255](注意:原图像素值必须要归一化)

    二、案例说明

    1、16U格式的图像一片漆黑

    • 首先加载一张原图并显示:
    • 然后将原图转换为16U格式的图像并显示。我们会发现图像一片漆黑,这是因为imshow函数内部自动将每个像素值除以256,因此我们看到的图像像素值都是小于1的(原图灰度值范围是0~255)。
    • 为了能够正常显示图像,我们对16U格式的图像乘以一个系数256即可:
    //opencv4.1.0
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main() {
    
        Mat src1, src2,src3;
    
        src1 = imread("1.png", 0);
        imshow("原图", src1);
    
        src1.convertTo(src2, CV_16U);
        imshow("格式转换图", src2);
    
        src2.convertTo(src3, CV_16U, 256);
        imshow("格式转换系数修正图", src3);
    
        waitKey(0);
        return 0;
    }
    

    2、32F格式的图像目标全是白色

    • 首先加载一张原图并显示:
    • 然后将原图转换为32F格式的图像并显示。我们会发现图像中目标全是白色,这是因为imshow函数内部自动将每个像素值乘以256,因此我们看到的图像像素值都是大于255的(原图灰度值范围是0- 255)。
    • 为了能够正常显示图像,我们对32F格式的图像进行归一化即可:
    //opencv4.1.0
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main() {
    
        Mat src1, src2,src3;
    
        src1 = imread("1.png", 0);
        imshow("原图", src1);
    
        src1.convertTo(src2, CV_32F);
        imshow("格式转换图", src2);
    
        normalize(src2, src3, 0, 1, NORM_MINMAX);
        imshow("格式转换系数修正图", src3);
    
        waitKey(0);
        return 0;
    }
    

    三、资料

    菜鸟笔记:
    https://www.coonote.com/note/imshow.html
    

    相关文章

      网友评论

          本文标题:imshow函数理解

          本文链接:https://www.haomeiwen.com/subject/vhengdtx.html