zoukankan      html  css  js  c++  java
  • 灰度图像直方图变换的一些代码

    常常。我们要对灰度图像做一些灰度变换。比方增强对照度一类的。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);
    }
    

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

  • 相关阅读:
    OI 复赛注意事项整理
    U138415 堆箱子 | 扩展欧几里得 扩欧
    扩欧-扩展欧几里得 | 数论学习笔记
    U138097 小鱼吃大鱼 埃氏筛
    牛客1029A 袜子分配
    U137971 公司搬迁
    初赛知识点整理
    SQL注入技术
    写出易于调试的SQL
    dos命令大全
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7217211.html
Copyright © 2011-2022 走看看