16位图片转换成8位图,并进行灰度值的范围调节
注:主要是通过调整upper_limit这个参数
cv::Mat float16touint8(cv::Mat image, float lower_limit, float upper_limit)
{
clock_t s = clock();
if (image.empty())
return cv::Mat();
int width = image.cols;//图片宽度
int height = image.rows;//图片高度
Mat dst = Mat::zeros(height, width, CV_8UC1);//先生成空的目标图片
double minv = 0.0, maxv = 0.0;
double* minp = &minv;
double* maxp = &maxv;
minMaxIdx(image, minp, maxp); //取得像素值最大值和最小值
maxv = min((int)maxv, 26000);
maxv *= upper_limit / 255.0;
//用指针访问像素,速度更快
ushort* p_img;
uchar* p_dst;
double val;
width *= height;
height = 1;
for (int i = 0; i < height; i++)
{
p_img = image.ptr<ushort>(i);//获取每行首地址
p_dst = dst.ptr<uchar>(i);
for (int j = 0; j < width; ++j)
{
val = (p_img[j] - minv) / (maxv - minv) * 255;
if (val > 255)
val = 255;
else if (val < 0)
val = 0;
p_dst[j] = val;
}
}
return dst;
}