Opencv中的imshow函数详解

本文详细解析了OpenCV中imshow函数的显示原理,通过案例展示了不同图像数据类型(如8U、16U、32F)在显示时的自动缩放规则,并提供了正确的图像类型转换与显示方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 前言

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

  • imshow函数详解

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

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

基于imshow函数的以上显示原则,我们举例进行验证。

案例一:

首先加载一张原图并显示:

然后将原图转换为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;
}

案例二:

首先加载一张原图并显示:

然后将原图转换为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;
}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的路飞桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值