GDAL真彩色图像平滑

6 篇文章 0 订阅
2 篇文章 0 订阅

简介

从这个博主的文章:

https://blog.csdn.net/shanchuan2012/article/details/24742475

借鉴了一下关于灰度图像的平滑的算法,所谓灰度图像就是只有一个波段的图像,那么真彩色(三波段)图像的处理也类似,不过是要对三个波段都执行一下平滑算法。

不多说:直接上代码:

处理函数代码

bool smoothform::smoothraster()
{
    //打开图像
    GDALDataset *poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset *) GDALOpen(ui->lineEdit->text().toStdString().c_str(),GA_ReadOnly);
    if(poDataset == nullptr)
    {
        //反馈代码
    }

        //获取一个光栅波段
    QList<GDALRasterBand*> bandList;
    bandList.append(poDataset->GetRasterBand(1));
    bandList.append(poDataset->GetRasterBand(2));
    bandList.append(poDataset->GetRasterBand(3));

    int nImgSizeX = poDataset->GetRasterXSize();     //横向像元个数
    int nImgSizeY = poDataset->GetRasterYSize();     //纵向像元个数
    int bandcount = poDataset->GetRasterCount();     //波段数
    BYTE *rband  = new BYTE[nImgSizeX * nImgSizeY];   //指向存储数据,一个波段
    BYTE *gband  = new BYTE[nImgSizeX * nImgSizeY];
    BYTE *bband  = new BYTE[nImgSizeX * nImgSizeY];

    bandList[0]->RasterIO( GF_Read, 0, 0, nImgSizeX, nImgSizeY,
                          rband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将一个波段存入pafScan
    bandList[1]->RasterIO( GF_Read, 0, 0, nImgSizeX, nImgSizeY,
                          gband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将一个波段存入pafScan
    bandList[2]->RasterIO( GF_Read, 0, 0, nImgSizeX, nImgSizeY,
                          bband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将一个波段存入pafScan

    //Create
    GDALDataset *poDstDS;
    const char  *pszFormat = "BMP";
    GDALDriver  *poDriver;
    poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); //获取驱动
    if( poDriver == nullptr )
        exit( 1 );

    poDstDS = poDriver->Create( ui->lineEdit_2->text().toStdString().c_str(), nImgSizeX, nImgSizeY, 3, GDT_Byte, NULL);//创建一个图像

    //处理图像rband
    float sumGray = 0;//灰度值之和
    for(int i=1; i< nImgSizeY-1; i++)    //中心点不包括外面一层
    {
        for(int j=1; j<nImgSizeX-1; j++)
        {
            //----------搜索八邻域begin----------
            sumGray = rband[i*nImgSizeX + j];
            for(int k=-1; k<2; k++)
            {
            for(int l=-1; l<2; l++)
                {
                    sumGray += rband[(i+k)*nImgSizeX + (j+l)];
                }
            }
            //----------搜索八邻域end----------


            rband[i*nImgSizeX + j] =sumGray / 10.0;
        }
    }

    //处理图像gband
    sumGray = 0;//灰度值之和
    for(int i=1; i< nImgSizeY-1; i++)    //中心点不包括外面一层
    {
        for(int j=1; j<nImgSizeX-1; j++)
        {
            //----------搜索八邻域begin----------
                sumGray = gband[i*nImgSizeX + j];
                for(int k=-1; k<2; k++)
                {
                for(int l=-1; l<2; l++)
                    {
                        sumGray += gband[(i+k)*nImgSizeX + (j+l)];
                    }
                }

            //----------搜索八邻域end----------

            gband[i*nImgSizeX + j] =sumGray / 10.0;
        }
    }

    //处理图像bband
    sumGray = 0;//灰度值之和
    for(int i=1; i< nImgSizeY-1; i++)    //中心点不包括外面一层
    {
        for(int j=1; j<nImgSizeX-1; j++)
        {
            //----------搜索八邻域begin----------
            sumGray = bband[i*nImgSizeX + j];
            for(int k=-1; k<2; k++)
            {
            for(int l=-1; l<2; l++)
                {
                    sumGray += bband[(i+k)*nImgSizeX + (j+l)];
                }
            }
            //----------搜索八邻域end----------


            bband[i*nImgSizeX + j] =sumGray / 10.0;
        }
    }

    //分波段存入
    poDstDS->GetRasterBand(1)->RasterIO( GF_Write, 0, 0,  nImgSizeX, nImgSizeY,
                                         rband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将缓存pafScan中的数据存入结果图像的波段1中
    poDstDS->GetRasterBand(2)->RasterIO( GF_Write, 0, 0,  nImgSizeX, nImgSizeY,
                                         gband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将缓存pafScan中的数据存入结果图像的波段2中
    poDstDS->GetRasterBand(3)->RasterIO( GF_Write, 0, 0,  nImgSizeX, nImgSizeY,
                                         bband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将缓存pafScan中的数据存入结果图像的波段3中


    //释放空间
    if( poDstDS != NULL )
        delete poDstDS;
    if(poDataset != NULL )
        delete poDataset;

        return true;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

airforcetop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值