OpenCV Tiff 图读取、转换为灰度图

一、imread读入tiff图

imread函数原型:

cv::Mat imread(const string& filename, int flags = 1 );

filename:读取图像的路径
flags :读入图像的格式

flags枚举,具体如下:

enum
{
/* 8bit, color or not */
   CV_LOAD_IMAGE_UNCHANGED  =-1,
/* 8bit, gray */
   CV_LOAD_IMAGE_GRAYSCALE  =0,
/* ?, color */
   CV_LOAD_IMAGE_COLOR      =1,
/* any depth, ? */
   CV_LOAD_IMAGE_ANYDEPTH   =2,
/* ?, any color */
   CV_LOAD_IMAGE_ANYCOLOR   =4
};

CV_LOAD_IMAGE_UNCHANGED – 该标识已经弃用
CV_LOAD_IMAGE_GRAYSCALE – 将图像读入为灰度
CV_LOAD_IMAGE_COLOR – 将图像读入为彩色
CV_LOAD_IMAGE_ANYDEPTH – 若读入的图像的深度为16位或者32位,返回对应深度的图像,否则,就转换为8位图像再返回
CV_LOAD_IMAGE_ANYCOLOR - 若读入图像为3通道,返回3通道图像,否则,转为单通道图像返回

灰度图、RGB图、多通道图、单通道图等一般图像,其像素取值都是0~255的整型值,也就是常说的8bit(2^8=256)图。而tiff图的像素值为浮点型,即16bit(float)或32bit(double),如果采用灰度图、RGB图等整形图的格式读入,则无法读入tiff图。

在imread函数的flags枚举中,其CV_LOAD_IMAGE_UNCHANGED 、CV_LOAD_IMAGE_GRAYSCALE 、CV_LOAD_IMAGE_COLOR 、CV_LOAD_IMAGE_ANYCOLOR均为整型图的读入项,只有CV_LOAD_IMAGE_ANYDEPTH可读入浮点型,选择该项后,imread函数会自动创建一张CV_32F类型的图像,然后填入数据。因而读取tiff图时flags应当设置为CV_LOAD_IMAGE_ANYDEPTH2

示例代码:

cv::Mat img = cv::imread(tiffPath, CV_LOAD_IMAGE_ANYDEPTH);

二、tiff图转换为灰度图

灰度图的数据类型必须是uint8,因而tiff图转换为灰度图的问题,即是将tiff的float像素值转化为0~255的整型值,然后写入一张CV_8U类型的灰度图即可。

假设tiff图最大深度值为z_max,最小深度值为z_min,得到tiff图深度区间

z_length = z_max - z_min

tiff像素值起始点归零值

bias = -z_min

转换间隔

grayStep = 255.0f / z_length

最终转换式

f(i,j) = (x(i,j) + bias) * grayStep

示例代码:

	float bias = -z_min;
	float z_length = z_max - z_min;
	float grayStep = 255.0f / z_length;
	cv::Mat gray(img.rows, img.cols, CV_8UC1);
	for (size_t i = 0; i < img.rows; i++)
	{
		for (size_t j = 0; j < img.cols; j++)
		{
			int grayVal = (int)((img.at<float>(i, j) + bias)*grayStep);
			gray.at<uchar>(i, j) = grayVal;
		}
	}

至于像素访问、赋值时的类型问题(即gray.at<uchar>(i, j)),参考下表

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值