GDAL 遥感 图像处理 锐化(Laplace算子、Sobel算子) 您所在的位置:网站首页 梯度算子和拉普拉斯算子的特点和区别 GDAL 遥感 图像处理 锐化(Laplace算子、Sobel算子)

GDAL 遥感 图像处理 锐化(Laplace算子、Sobel算子)

2024-07-15 12:17| 来源: 网络整理| 查看: 265

GDAL 图像锐化 简介拉普拉斯(Laplace)算子部分代码: 索贝尔(Sobel)算子部分代码: 处理效果原图(Laplace)(Sobel) 结尾参考文章

简介

图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。

各种算子是图像锐化的核心,GDAL中没有提供相应的方法,所以我参考了网上C++的图像处理算法和GDAL进行了融合:

拉普拉斯(Laplace)算子

拉普拉斯算子是一个是n维欧几里德空间中的一个二阶微分算子,它的定义如下:

在这里插入图片描述

在x方向上

在这里插入图片描述

在y方向上

在这里插入图片描述

合起来就是 在这里插入图片描述

拉普拉斯强调的是图像中灰度的突变,并不强调图像的灰度缓变(灰度缓变由一阶微分,也就是梯度,图像应用是sobel算子,具体下面介绍)

根据上边的表达式,可以确定拉普拉斯算子的模板: 4邻域8邻域 4邻域8邻域

部分代码:

可根据我的另一篇博客(图像平滑),通过改动算法核心写出锐化函数。

int laplace4[3][3] = { 0, -1, 0, -1, 5, -1, 0, -1, 0 };//laplace锐化模板,4邻域 int laplace8[3][3] = { -1, -1, -1, -1, 9, -1, -1, -1, -1 };//laplace锐化模板,8邻域 int m,n; //平滑算子也是通过模板进行处理的,所以可以把平滑处理和锐化处理通过一个函数实现 int biBitCount = 8; //红色波段处理 //分配新像素组的空间 int lineByte = (nImgSizeX * biBitCount / 8 + 3) / 4 * 4; rbandsmooth = new unsigned char[lineByte * nImgSizeY]; //进行模板操作 for (int i = 0; i if (i == 0 || j == 0 || i == nImgSizeY - 1 || j == nImgSizeX - 1) rbandsmooth[i*nImgSizeX + j] = rband[i*nImgSizeX + j]; else { int sum = 0; for (m = i - 1; m for (int j = 0; j int sum = 0; for (m = i - 1; m for (int j = 0; j int sum = 0; for (m = i - 1; m 1,2,1,0,0,0,-1,-2,-1};//sobelx int sobely[3][3] = { 1,0,-1,2,0,-2,1,0,-1};//sobely int m,n; //平滑算子也是通过模板进行处理的,所以可以把平滑处理和锐化处理通过一个函数实现 unsigned char *imagedatasobelx; unsigned char *imagedatasobely; //分配新像素组的空间 int lineByte = (nImgSizeX * biBitCount / 8 + 3) / 4 * 4; rbandsmooth = new unsigned char[lineByte * nImgSizeY]; imagedatasobelx = new unsigned char[lineByte * nImgSizeY]; imagedatasobely = new unsigned char[lineByte * nImgSizeY]; //进行模板操作 for (int i = 0; i if (i == 0 || j == 0 || i == nImgSizeY - 1 || j == nImgSizeX - 1) { *(imagedatasobelx + i*nImgSizeX + j) = rband[i*nImgSizeX + j]; *(imagedatasobely + i*nImgSizeX + j) = rband[i*nImgSizeX + j]; } else { int sumx = 0; int sumy = 0; for (int m = i - 1; m for (int j = 0; j *(imagedatasobelx + i*nImgSizeX + j) = gband[i*nImgSizeX + j]; *(imagedatasobely + i*nImgSizeX + j) = gband[i*nImgSizeX + j]; } else { int sumx = 0; int sumy = 0; for (int m = i - 1; m for (int j = 0; j *(imagedatasobelx + i*nImgSizeX + j) = bband[i*nImgSizeX + j]; *(imagedatasobely + i*nImgSizeX + j) = bband[i*nImgSizeX + j]; } else { int sumx = 0; int sumy = 0; for (int m = i - 1; m


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有