天天看點

16 bit 的灰階圖如何顯示

16 bit 的灰階圖如何在QT中顯示

用Mat構造的 16 bit 灰階圖 無法直接顯示,需要轉換成 8 bit 的灰階圖在QT中顯示,

使用OpenCV自帶的最大最小值歸一法,

cv::normalize(inMat, inMat2, 0., 255., cv::NORM_MINMAX, CV_8UC1)
           
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;

        }

    }

}

           
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);

}