2 uehncfch uehncfch 于 2017.12.07 21:34 提问

opencv如何将16位深度影像转换为8位深度并显示?

请问opencv如何将16位深度影像转换为8位深度的影像?我想用opencv处理一幅16位无符号整型3个波段的遥感影像,直接处理会报错而且imshow显示不出来。所以需要转换成8位的,下面是我的代码,imshow显示一片黑,不知为何?

//输入影像为16位无符号整型,3个波段
Mat img3 = imread("example.tif");
Mat img4;
img3.convertTo(img4, CV_8UC3);

imshow("3", img4);

2个回答

gongcheng
gongcheng   2017.12.07 23:01
已采纳

你这样做是不行的,那个只是强制的数值转化,就好一个int 强转为 uchar得到值是一个错误值, 你应该把16位的规格化到8位上去,即自己逐像素转换 ,即 像素值 * p。double p = (double)std::numeric_limits::max() / std::numeric_limits::max()

uehncfch
uehncfch 好的,我试一下,谢谢您
6 天之前 回复
gongcheng
gongcheng 回复uehncfch: 刚才写错,应该是 目标像素=(源像素-最小值)/((最大值-最小值)/255)
7 天之前 回复
gongcheng
gongcheng 回复uehncfch: 还有一种方法就是先得到颜色的最小值和最大值,目标像素=(源像素-最小值)*(最大值-最小值)/255+最小值
7 天之前 回复
gongcheng
gongcheng 回复uehncfch: 对的,但不是除255,是除(65535/255)
7 天之前 回复
uehncfch
uehncfch 您好,请问是把原始影像的像素值除以255再赋值到新影像上吗?或者有没有别的办法用opencv显示一张16位无符号3通道的遥感影像?我是因为opencv处理16位的影像报错才想转成8位的...T^T...求教
7 天之前 回复
yulimin0909
yulimin0909   2017.12.08 08:32
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!