• 灰度图像直方图变换的一些代码


    常常。我们要对灰度图像做一些灰度变换。比方增强对照度一类的。openCV 没有直接提供函数来处理。

    须要我们写一点代码。这里就贴几个我常常常使用到的代码片段。

    今天的代码中用到了些曾经写的代码的功能。详细的能够參考:
    http://blog.csdn.net/liyuanbhu/article/details/50708912

    首先是直方图正规化。所谓直方图正规化。就是将图像中最暗的地方的亮度设为 0。 最亮的地方的亮度设为 255,其它的地方的亮度线性映射。

    cv::Mat Histogram1D::normalize(const cv::Mat &image)
    {
        // Compute histogram first
        cv::MatND hist = getHistogram(image);
        int imin, imax;
        for(imin = 0; imin < histSize[0]; imin++)
        {
            if(hist.at<float>(imin) > 0) break;
        }
    
        for(imax = histSize[0] - 1; imax >= 0; imax--)
        {
            if(hist.at<float>(imax) > 0) break;
        }
    
        cv::Mat lookup(1, 256, CV_8U);
    
        for(int i = 0; i < 256; i++)
        {
            if(i < imin) lookup.at<uchar>(i) = 0;
            else if(i > imax) lookup.at<uchar>(i) = 255;
            else
            {
                int v = 255 * (i - imin) / (imax - imin);
                lookup.at<uchar>(i) = static_cast<uchar>(v);
            }
        }
        cv::Mat ret;
        cv::LUT(image, lookup, ret);
        return ret;
    }
    

    然后是图像增强的一种常见方法。灰度值拉伸。简单的说就是舍弃亮度直方图中最亮和最暗的一小部分。将其余的部分拉伸到 0 到 255。

    以下是代码:

    cv::Mat Histogram1D::stretch(const cv::Mat &image, double percent1, double percent2)
    {
    
        cv::MatND hist = getHistogram(image);
        int imin, imax;
        if(percent1 < 0.0) percent1 = 0.0;
        if(percent1 > 1.0) percent1 = 1.0;
        percent1 = image.rows * image.cols * percent1;
        double value = 0;
        for(imin = 0; imin < histSize[0]; imin++)
        {
            value += hist.at<float>(imin);
            if(value > percent1) break;
        }
    
        value = 0;
        if(percent2 < 0.0) percent2 = 0.0;
        if(percent2 > 1.0) percent2 = 1.0;
        percent2 = image.rows * image.cols * percent2;
        for(imax = histSize[0] - 1; imax >= 0; imax--)
        {
            value += hist.at<float>(imax);
            if(value > percent2) break;
        }
        //int dim = 256;
        cv::Mat lookup(1, 256, CV_8U);
    
        for(int i = 0; i < 256; i++)
        {
            if(i < imin) lookup.at<uchar>(i) = 0;
            else if(i > imax) lookup.at<uchar>(i) = 255;
            else
            {
                int v = 255 * (i - imin) / (imax - imin);
                lookup.at<uchar>(i) = static_cast<uchar>(v);
            }
        }
        cv::Mat ret;
        cv::LUT(image, lookup, ret);
        return ret;
    }
    cv::Mat Histogram1D::stretch(const cv::Mat &image, double percent)
    {
        return stretch(image, percent, percent);
    }
    

    代码都很简答,就不多解释了。

  • 相关阅读:
    java实训
    二维数组转置
    java第四次上机
    建立一个窗体
    java第三次上机
    数据结构晚自习
    Java程序设计第一次作业
    JAVA程序设计的第一次作业
    java中窗体的转化
    数据结构串的使用
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7217211.html
Copyright © 2020-2023  润新知