GDAL 遥感 图像处理 锐化(Laplace算子、Sobel算子) | 您所在的位置:网站首页 › 梯度算子和拉普拉斯算子的特点和区别 › GDAL 遥感 图像处理 锐化(Laplace算子、Sobel算子) |
GDAL 图像锐化
简介拉普拉斯(Laplace)算子部分代码:
索贝尔(Sobel)算子部分代码:
处理效果原图(Laplace)(Sobel)
结尾参考文章
简介
图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。 各种算子是图像锐化的核心,GDAL中没有提供相应的方法,所以我参考了网上C++的图像处理算法和GDAL进行了融合: 拉普拉斯(Laplace)算子拉普拉斯算子是一个是n维欧几里德空间中的一个二阶微分算子,它的定义如下: 在x方向上 在y方向上 合起来就是 拉普拉斯强调的是图像中灰度的突变,并不强调图像的灰度缓变(灰度缓变由一阶微分,也就是梯度,图像应用是sobel算子,具体下面介绍) 根据上边的表达式,可以确定拉普拉斯算子的模板: 部分代码:可根据我的另一篇博客(图像平滑),通过改动算法核心写出锐化函数。 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 实验室设备网 版权所有 |