C#结合GDAL实现中值滤波

 private void btnMiddleFilter_Click(object sender, EventArgs e)
        {
            string openFileName = "";
            OpenFileDialog ofd = new OpenFileDialog();
            if(ofd.ShowDialog()==DialogResult.OK)
            {
                openFileName = ofd.FileName;
            }
            
            Gdal.AllRegister();

            //更改读写权限
            Dataset srcDs = Gdal.Open(openFileName, Access.GA_Update);

            DataType srcType = srcDs.GetRasterBand(1).DataType;

            int bandCount = srcDs.RasterCount;
            int srcWidth = srcDs.RasterXSize;
            int srcHeight = srcDs.RasterYSize;

            Debug.WriteLine("原始影像数据类型是:{0}", srcType);
            Debug.WriteLine("原始影像的列数:{0}", srcWidth);
            Debug.WriteLine("原始影像的行数:{0}", srcHeight);


            int[] bandArray = new int[bandCount];
            for (int i = 0; i < bandCount; i++)
            {
                bandArray[i] = i + 1;
            }

            if (srcType == DataType.GDT_UInt16)
            {
                int[] dataArray = new int[srcWidth * srcHeight * bandCount];
                int[] newArray = new int[srcWidth * srcHeight * bandCount];
                srcDs.ReadRaster(0, 0, srcWidth, srcHeight, dataArray, srcWidth, srcHeight, bandCount, bandArray, 0, 0, 0);

                /***********中值滤波实现**************/
                int[] temp = new int[5];
                for (int i = 0; i < srcHeight; i++)
                {
                    for (int j = 0; j < srcWidth - 2; j++)
                    {
                        if (j >= 2)//从第三列开始
                        {
                            temp[0] = dataArray[i * srcWidth + j - 2];
                            temp[1] = dataArray[i * srcWidth + j - 1];
                            temp[2] = dataArray[i * srcWidth + j];
                            temp[3] = dataArray[i * srcWidth + j + 1];
                            temp[4] = dataArray[i * srcWidth + j + 2];
                            Array.Sort(temp);//排序
                            newArray[i * srcWidth + j] = temp[2];
                        }
                        else
                            newArray[i * srcWidth + j] = dataArray[i * srcWidth + j];
                    }
                }

                //将更新数值的数据重新写入图像
                srcDs.WriteRaster(0, 0, srcWidth, srcHeight, newArray, srcWidth, srcHeight, bandCount, bandArray, 0, 0, 0);

                srcDs.FlushCache();
            }
            //最后释放资源
            srcDs.Dispose();
            MessageBox.Show("中值滤波:success");
            
        }

原图:


原图细节:


中值滤波结果(不明显,需要结合下面的细节展示来观察):


细节展示:


GDAL是一个开源的地理信息系统库,它提供了对各种栅格和矢量地理数据格式的读取和写入功能。中值滤波是一种常用的数字图像处理方法,可以用于去除图像中的噪声。在GDAL中,可以使用C++语言实现中值滤波。 下面是一个使用GDAL C++实现中值滤波的示例代码: ```c++ #include "gdal_priv.h" #include "cpl_conv.h" // for CPLMalloc() int main() { GDALAllRegister(); // 打开输入图像 GDALDataset *poDataset = (GDALDataset *) GDALOpen("input.tif", GA_ReadOnly); if (poDataset == NULL) { printf("Open failed.\n"); exit(1); } // 获取图像宽度和高度 int nXSize = poDataset->GetRasterXSize(); int nYSize = poDataset->GetRasterYSize(); // 创建输出图像 GDALDriver *poDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); GDALDataset *poDstDS = poDriver->Create("output.tif", nXSize, nYSize, 1, GDT_Float32, NULL); // 定义中值滤波的窗口大小 int nWindowSize = 3; // 定义中值滤波的缓冲区 float *pafWindow = (float *) CPLMalloc(sizeof(float) * nWindowSize * nWindowSize); // 对每个像素进行中值滤波 for (int i = 0; i < nYSize; i++) { for (int j = 0; j < nXSize; j++) { // 读取窗口内的像素值 int nIndex = 0; for (int m = i - nWindowSize / 2; m <= i + nWindowSize / 2; m++) { for (int n = j - nWindowSize / 2; n <= j + nWindowSize / 2; n++) { if (m >= 0 && m < nYSize && n >= 0 && n < nXSize) { pafWindow[nIndex++] = poDataset->GetRasterBand(1)->ReadAsFloat(n, m); } } } // 对窗口内的像素值进行排序 for (int k = 0; k < nIndex - 1; k++) { for (int l = k + 1; l < nIndex; l++) { if (pafWindow[k] > pafWindow[l]) { float fTemp = pafWindow[k]; pafWindow[k] = pafWindow[l]; pafWindow[l] = fTemp; } } } // 将中值赋给输出图像 poDstDS->GetRasterBand(1)->WriteFloat(j, i, pafWindow[nIndex / 2]); } } // 释放资源 CPLFree(pafWindow); GDALClose(poDataset); GDALClose(poDstDS); return 0; } ``` 在上面的代码中,我们首先打开输入图像,然后创建输出图像。接着,我们定义了中值滤波的窗口大小,并创建了一个缓冲区用于存储窗口内的像素值。然后,我们对每个像素进行中值滤波,具体步骤是读取窗口内的像素值,对像素值进行排序,然后将中值赋给输出图像。最后,我们释放了缓冲区和数据集,并返回0表示程序正常结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值