Opencv中的imshow函数详解

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

使用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;
}

 

05-27
### 关于 `imshow` 函数的使用方法 #### 基本功能 `imshow` 是 MATLAB 中的一个核心函数,主要用于显示图像数据。它支持多种类型的输入数据以及灵活的参数配置,能够满足不同场景下的需求[^1]。 #### 参数说明 以下是 `imshow` 的主要语法形式及其对应的用途: 1. **基本调用** ```matlab imshow(I); ``` 显示灰度图像 `I`,其中像素值被映射到当前颜色图的颜色范围。 2. **指定亮度范围** ```matlab imshow(I, [low high]); ``` 将灰度图像中的像素值限定在 `[low, high]` 范围内进行缩放并显示。超出此范围的值会被裁剪[^1]。 3. **自动调整亮度范围** ```matlab imshow(I, []); ``` 自动计算合适的最小值和最大值来定义显示范围,并将其应用于图像。 4. **彩色图像** ```matlab imshow(RGB); ``` 显示真彩 (RGB) 图像,该图像由 m×n×3 数组表示,数组中的每一层分别对应红色、绿色和蓝色通道[^1]。 5. **二值图像** ```matlab imshow(BW); ``` 显示二值图像 `BW`,通常是一个逻辑矩阵或仅含 0 和 1 的数值矩阵[^1]。 6. **索引图像** ```matlab imshow(X, map); ``` 使用颜色图 `map` 来显示索引图像 `X`,其中每个像素值作为颜色表中的索引来决定其颜色。 7. **文件名加载** ```matlab imshow(filename); ``` 直接读取并显示存储在文件中的图像,无需先加载到内存中[^1]。 8. **带选项的高级调用** ```matlab imshow(___, Name, Value); ``` 可以通过名称-值对的形式传递额外参数,例如 `'Border'`, `'InitialMagnification'` 等,进一步定制显示效果[^2]。 9. **返回句柄** ```matlab himage = imshow(___); ``` 返回一个图形对象句柄 `himage`,允许后续操作对该图像进行修改或查询属性[^1]。 #### 示例代码 下面是一些典型的 `imshow` 应用实例: ##### 显示灰度图像 ```matlab % 创建随机灰度图像 grayImage = rand(100); % 显示图像 figure; imshow(grayImage); % 默认显示 title('Gray Image'); ``` ##### 显示 RGB 彩色图像 ```matlab % 加载内置示例图像 rgbImage = imread('peppers.png'); % 显示图像 figure; imshow(rgbImage); title('Color Image'); ``` ##### 设置自定义亮度范围 ```matlab % 定义特定范围内的灰度图像 customRangeImage = uint8([zeros(100), ones(100)*255]); % 指定低高阈值 figure; imshow(customRangeImage, [0, 128]); % 缩放到 [0, 128] title('Custom Range Gray Image'); ``` ##### 添加边框控制 ```matlab % 控制边界样式 figure; imshow(rgbImage, 'Border', 'tight'); % 移除多余空白区域 title('Tight Border Example'); ``` --- #### 总结 `imshow` 提供了丰富的接口设计,无论是简单的灰度/彩色图像展示还是复杂的动态交互应用,都能轻松实现。掌握这些基础语法与扩展特性有助于更高效地处理可视化任务。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

进击的路飞桑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值