zoukankan      html  css  js  c++  java
  • 全黑图像去除


    本系列文章由 @yhl_leo 出品,转载请注明出处。
    文章链接: http://blog.csdn.net/yhl_leo/article/details/50904358


    昨天一个朋友,向我求助,帮忙去除掉一组遥感影像数据中,因为裁剪时产生的全黑图像,实现起来也很简单,就将工程代码提供给大家:

    GitHub链接:yhlleo/ImageFormatConversion

    图像格式为单通道16-bit的tif,可以使用OpenCV库读取:

    cv::Mat curImage = cv::imread(fileName, IMREAD_UNCHANGED);

    因为图像是16-bit的,所指使用图片查看器,浏览的话,肯定是全黑的。但是可以在Photoshop中,调整灰度曲线,显示图片内容(将曲线调成近似直角折线):

    image_ps

    那些黑色图像(真的是全黑,像素值为0),判断方法比较简单,获取图像灰度最大最小值,区间范围是0,必然是全黑图像:

    double pMax = 0, pMin = 0;
    cv::minMaxIdx(curImage, &pMin, &pMax);
    int pRange = pMax - pMin;
    
    if ( pRange > 0 )
    {
        // ...
    }
    else
    {
        // Black image 
        // ...
    }

    如果想把16-bit图像转为常见的8-bit图像,我使用的方法是这样的:

    if( pRange > 0 )
    {
        for ( int i=0; i<rows*cols; ++i )
        {
            int pValue = ( static_cast<int>(*++data_cur & 0xffff) - ipMin ) * 255 / pRange;
            data_trans[i] = static_cast<uchar>(pValue);
        }
    }

    即,使用简单的线性拉伸方法:

    pi=(pipmin)255pmaxpmin(1)

    另外,为了操作简单,将代码写成批处理的形式:

    std::vector<std::string> file_list = getFileList(input_folder);

    指定图片所在文件夹后,自动加载当前文件夹子目录下的所有tif图片,以vector的形式返回文件名。

    由于每张图片的操作是独立的,所以还可以把OpenMP开启:

    #pragma omp parallel for

    工程编译环境,如下:

    • CMake ( version >= 2.8.3)
    • Visual Studio 2010
    • OpenCV

    测试程序:

    • BlackImageFilterTest:滤除全黑图像,其余文件自动另存至当前图像文件下的空子目录下
    • ImageConversionTest:将原16-bit图像转为8-bit,可选择地保留或去除全黑图像

    编译结果如图:

    compile

    测试结果:

    • 转为8-bit图像,保留全黑图
      compile2

    • 转为8-bit图像,删除全黑图
      compile3

  • 相关阅读:
    逐点分析,这样做Web端性能测试
    如何完成大数据测试-从功能测试角度分析
    自动化测试和手动测试利弊
    (一)SQL注入漏洞测试的方式总结
    如何设计一个完整的测试用例
    测试与开发、产品、上下级沟通、
    黑盒测试用例设计总结
    改变测试思路,你的性能测试才能更值钱!(下)
    20190923-03Linux时间日期类 000 011
    20190923-02Linux文件目录类 000 010
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332145.html
Copyright © 2011-2022 走看看