16 bit 的灰度图如何在QT中显示

用Mat构造的 16 bit 灰度图 无法直接显示,需要转换成 8 bit 的灰度图在QT中显示,

使用OpenCV自带的最大最小值归一法,

cv::normalize(inMat, inMat2, 0., 255., cv::NORM_MINMAX, CV_8UC1)

将16 bit的值map到8 bit,但是会有memory access violation 的错误,想了一想,应该还是Mat中存放像素数据的内存空间,前后不一致了,从16 bit(ushort) 变成了 8 bit(uchar),所以内存访问出现错误。

以下函数其实和上面的函数是一样的功能

void normalizeMat(const cv::Mat& source, cv::Mat& dest, quint8 minv, quint8 maxv)

{

    int cols = source.cols;

    int rows = source.rows;

    for (int k = 0; k < rows; k++)

    {
        const ushort* matRowPtr = source.ptr<ushort>(k);         quint8* destMatRowPtr = dest.ptr<quint8>(k);         for (int j = 0; j < cols; j++)         {             quint8 pixData = static_cast<quint8>((*matRowPtr++ - minv) / (maxv -
minv) * 255);             *destMatRowPtr++ = pixData;         }     } }

想要正确显示,先构造RGB888的image, 把16 bit的像素值采用最大最小化方法映射到8 bit,填满三个通道(三个通道值是一样的)。

QPixmap convert8to16uc1(const cv::Mat& source)
{     double minv = 0, maxv = 0;     Point minLoc(0, 0), maxLoc(0, 0);     cv::minMaxLoc(source, &minv, &maxv, &minLoc, &maxLoc);     quint16* pSource = (quint16*)source.data;     int pixelCounts = source.cols * source.rows;     QImage dest(source.cols, source.rows, QImage::Format_RGB888);     quint8* pDest = (quint8*)dest.bits();     for (int i = 0; i < pixelCounts; i++)     {         //quint8 value = (quint8)((*(pSource)) >> 8);         //quint8 value = static_cast<quint8>((*pSource - minv) / (maxv - minv) *
255);         quint8 value = static_cast<quint8>(floor(((*pSource - minv) / (maxv - minv)
* 255)));         *(pDest++) = value;  // B         *(pDest++) = value;  // G         *(pDest++) = value;  // R         pSource++;     }     return QPixmap::fromImage(dest); }

16 bit 的灰度图如何显示的更多相关文章

  1. 8位灰度图在LCD上显示

    一.概述 1.灰度 灰度使用黑色调表示物体,即用黑色为基准色,不同的饱和度的黑色来显示图像.每个灰度对象都具有从 0%(白色)到灰度条100%(黑色)的亮度值. 使用黑白或灰度扫描仪生成的图像通常以灰 ...

  2. 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中

    //从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...

  3. Matlab 如何/怎样 读取图片 显示图片 转换成灰度图

    % 读取图片 im = imread('路径') >> im = imread('ny.png'); % 显示图片 imshow(im) >> imshow(im) % 转换成 ...

  4. python显示灰度图

    import matplotlib import matplotlib.pyplot as plt %matplotlib inline im=plt.imread('../lena.jpg', py ...

  5. Qt生成灰度图(转载)

    Qt生成灰度图(转载)   项目中用到大量基础图像处理知识,其中灰度图的生成是很重要的一环. 先补充一些基础知识: ------------------------------------------ ...

  6. Android 将ARGB图片转换为灰度图

    思路如下: 1.读取or照相,得到一张ARGB图片. 2.转化为bitmap类,并对其数据做如下操作: A通道保持不变,然后逐像素计算:X = 0.3×R+0.59×G+0.11×B,并使这个像素的值 ...

  7. 【Qt开发】QImage设置为8-bit灰度图

    项目中用到大量基础图像处理知识,其中灰度图的生成是很重要的一环. 先补充一些基础知识: -------------------------------------------------------- ...

  8. Android-将RGB彩色图转换为灰度图

    package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...

  9. c语言实现灰度图转换为二值图

    将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置0,否则设置为255,为得到更好的效果不同图片应采用不同的值 /* 2015年6月2日11:16:22 灰度图转换为二值图 blog:http ...

随机推荐

  1. 第十八篇 -- QTreeWidget应用篇 -- kuwo

    效果图: 最近学习QTreeWidget,总想着做些什么,正好学习过一点简单的爬虫,就做了一个简易的"酷我音乐下载器",界面可能不太好看,以后继续优化. ui_kuwo.py # ...

  2. 第七篇 -- 常用界面组件的使用(QSlider和QProgressBar)

    首先画个图 ui_proBar.py # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'ui_ ...

  3. Python - if 条件控制

    注意 本篇图片素材都来自慕课网,因为素材过于优秀,直接拿过来了,加水印只是为了防止整篇文章被搬 前言 程序并非是一成不变的向下执行,有的时候也要根据条件的不同选择不一样的代码,这个时候便用到了分支结构 ...

  4. Linux系统进入redis并查询值

    1.进入redisredis-cli -h ip -p port2.查看具体信息info 3.得到redis中存储的所有key值KEYS *4.获取指定key值的value值get "key ...

  5. sqli-labs靶机

    第一关   1' 第二关   1 第三关    1') 第四关    1'') 第五关   1'     +         extractvalue报错注入 第六关   1 "  +    ...

  6. JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

    目录 JSP的执行原理.JSP的内置对象.四大作用域解析.MVC模式理解 JSP的执行原理 这里拿一个小例子来解析JSP是如何被访问到的 首先将该项目部署到tomcat,并且通过tomcat启动 通过 ...

  7. Python学习的十个阶段,学完神功大成,对应一下看看你自己在哪个阶段

    大家好,我是白云. 今天给大家整理了Python学习的十个阶段内容,看看你现在正处于哪个阶段,想学习的朋友也可以根据这个阶段规划学习. 阶段一:Python基础[ 初入江湖] Linux基础 目标: ...

  8. Java互联网架构师系统进阶课程学习 (3)【享学】

    3.原子操作CAS Atom(不可分割) 什么是原子操作?如何实现原子操作? syn基于阻塞的锁的机制,1.被阻塞的线程优先级很高,2.拿到锁的线程一直不释放锁怎么办?3.大量的竞争,消耗cpu,同时 ...

  9. 第3篇-CallStub新栈帧的创建

    在前一篇文章 第2篇-JVM虚拟机这样来调用Java主类的main()方法  中我们介绍了在call_helper()函数中通过函数指针的方式调用了一个函数,如下: StubRoutines::cal ...

  10. curl的基本使用

    基本使用 1. 初始化 初始化非常简单,只需要调用curl_init()函数即可,他会返回一个curl句柄,后边几乎其他关于curl的设置,关闭等函数都需要使用这个句柄 $curl = curl_in ...