拉普拉斯锐化算法是读取目标像素上下左右四个像素值,将上下左右四个像素值分别减去目标像素值,再将结果之和加上目标像素值作为目标像素最后的值,也就是说当目标像素与周围像素差值较大,那么计算后会进一步拉大差值,突出图像上物体边缘部分,达到锐化效果。

一般jgp或者png格式图像采用Java ImageIO直接读取所有像素后进行拉普拉斯锐化即可,为了更方便读取tif格式影像则需要引入gdal。使用gdal读取tif影像基本信息,获取影像宽、高、通道数。一般彩色影像包含RGB三个通道或者还有一个表示透明度的阿尔法通道。RGB通道一般对应tif图像1、2、3通道,阿尔法通道一般为第4通道。

读取影像基本信息:

gdal.AllRegister();
Dataset srcDataset = gdal.Open(srcImage.toString(), gdalconstConstants.GA_ReadOnly);
int width = srcDataset.getRasterXSize();
int height = srcDataset.getRasterYSize();
Driver driver = srcDataset.GetDriver();
int count = srcDataset.GetRasterCount();

对tif影像进行拉普拉斯锐化,首先读取影像信息后转为BufferdImage,使用处理BufferdImage的拉普拉斯算法进行处理,之后再将BufferdImage转为tif图像。处理过程需要考虑到BufferdImage最大支持的图像宽和高为26663,而tif格式正射影像没有这一限制,那么处理过程需要考虑tif影像宽高是否超限,可以设定当tif影像宽或高超过26000像素就对影像进行拆分处理,如果没有超限则直接读取tif影像并转换为BufferdImage。

具体实现:

if (count <= 3) {Dataset destDataset = driver.Create(destImage.toString(), width, height, count);destDataset.SetMetadata(srcDataset.GetMetadata_Dict()); Band srcBandR = srcDataset.GetRasterBand(1);Band srcBandG = srcDataset.GetRasterBand(2);Band srcBandB = srcDataset.GetRasterBand(3);Band destBandR = destDataset.GetRasterBand(1);Band destBandG = destDataset.GetRasterBand(2);Band destBandB = destDataset.GetRasterBand(3);int xIndex = (int)(width / 26000);int yIndex = (int)(height / 26000);int innerWidth = width / (xIndex + 1);int innerHeight = height / (yIndex + 1);BufferedImage innerImage = new BufferedImage(innerWidth, innerHeight, BufferedImage.TYPE_INT_RGB);for(int i = 0; i <= yIndex ; i ++) {for(int j = 0; j <= xIndex ;j++) {for (int y = 0; y < innerHeight; y++) {int[] arrayR = new int[innerWidth];int[] arrayG = new int[innerWidth];int[] arrayB = new int[innerWidth];srcBandR.ReadRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayR);srcBandG.ReadRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayG);srcBandB.ReadRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayB);for (int x = 0; x < innerWidth; x++) {int valueR = arrayR[x];int valueG = arrayG[x];int valueB = arrayB[x];int rgb = (clamp((int) valueR) & 0xff) << 16 | (clamp((int) valueG) & 0xff) << 8| (clamp((int) valueB) & 0xff);innerImage.setRGB(x, y, rgb);}}innerImage = new LaplacianSharpen().lapLaceSharp(innerImage);for (int y = 0; y < innerHeight; y++) {int[] arrayR = new int[innerWidth];int[] arrayG = new int[innerWidth];int[] arrayB = new int[innerWidth];for (int x = 0; x < innerWidth; x++) {int rgb = innerImage.getRGB(x, y);int valueR = (rgb >> 16) & 0xff;int valueG = (rgb >> 8) & 0xff;int valueB = rgb & 0xff;arrayR[x] = valueR;arrayG[x] = valueG;arrayB[x] = valueB;}destBandR.WriteRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayR);destBandG.WriteRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayG);destBandB.WriteRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayB);}}}driver.delete();srcDataset.delete();destDataset.delete();}else {Dataset destDataset = driver.Create(destImage.toString(), width, height, 4);destDataset.SetMetadata(srcDataset.GetMetadata_Dict()); Band srcBandR = srcDataset.GetRasterBand(1);Band srcBandG = srcDataset.GetRasterBand(2);Band srcBandB = srcDataset.GetRasterBand(3);Band destBandR = destDataset.GetRasterBand(1);Band destBandG = destDataset.GetRasterBand(2);Band destBandB = destDataset.GetRasterBand(3);// 读取信息int xIndex = (int)(width / 26000);int yIndex = (int)(height / 26000);int innerWidth = width / (xIndex + 1);int innerHeight = height / (yIndex + 1);BufferedImage innerImage = new BufferedImage(innerWidth, innerHeight, BufferedImage.TYPE_INT_RGB);for(int i = 0; i <= yIndex ; i ++) {for(int j = 0; j <= xIndex ;j++) {for (int y = 0; y < innerHeight; y++) {int[] arrayR = new int[innerWidth];int[] arrayG = new int[innerWidth];int[] arrayB = new int[innerWidth];srcBandR.ReadRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayR);srcBandG.ReadRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayG);srcBandB.ReadRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayB);for (int x = 0; x < innerWidth; x++) {int valueR = arrayR[x];int valueG = arrayG[x];int valueB = arrayB[x];int rgb = (clamp((int) valueR) & 0xff) << 16 | (clamp((int) valueG) & 0xff) << 8| (clamp((int) valueB) & 0xff);innerImage.setRGB(x, y, rgb);}}innerImage = new LaplacianSharpen().lapLaceSharp(innerImage);for (int y = 0; y < height; y++) {int[] arrayR = new int[innerWidth];int[] arrayG = new int[innerWidth];int[] arrayB = new int[innerWidth];for (int x = 0; x < innerWidth; x++) {int rgb = innerImage.getRGB(x, y);int valueR = (rgb >> 16) & 0xff;int valueG = (rgb >> 8) & 0xff;int valueB = rgb & 0xff;arrayR[x] = valueR;arrayG[x] = valueG;arrayB[x] = valueB;}destBandR.WriteRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayR);destBandG.WriteRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayG);destBandB.WriteRaster(j * innerWidth, i * innerHeight + y, innerWidth, 1, arrayB);}}}Band srcBand = srcDataset.GetRasterBand(4);Band destBand = destDataset.GetRasterBand(4);for (int y = 0; y < height; y++) {int[] array = new int[width];srcBand.ReadRaster(0, y, width, 1, array);destBand.WriteRaster(0, y, width, 1, array);}driver.delete();srcDataset.delete();destDataset.delete();}

处理前影像:

处理后影像:

使用gdal和java对TIF格式正射影像进行拉普拉斯锐化相关推荐

  1. Java实现图片(jpg/png)转成TIF格式(300dpi)踩坑笔记

    一.TIF/TIFF介绍 引用百度百科的一句话总结: 标签图像文件格式(Tag Image File Format,简写为TIFF)是一种灵活的位图格式,主要用来存储包括照片和艺术图在内的图像. 二. ...

  2. java 判断图片格式_Java判断上传图片格式的实例代码

    先给大家介绍下java判断上传图片格式. 由于客户上传图片将png的图片的后缀名改为jpg,所以通过后缀名判断不行,用下面这个方法可以 //判断是否是JPG格式 log.info("-1-- ...

  3. python处理nc数据转换为tif格式

    应用背景 最近在做蒸散发的相关数据处理,上一篇用ArcPy进行处理,发现太慢了,于是继续寻找简便方法.此篇文章为可运行代码. 参考文献:<使用Python语言将.nc格式影像转换成TIF格式,. ...

  4. 如何用python将nc格式文件转换为tif格式

    可以使用gdal库来将nc格式文件转换为tif格式,具体步骤如下: 安装gdal库:pip install gdal 使用gdal库中的gdal_translate函数:gdal_translate ...

  5. python可视化DEM遥感影像(tif格式)||xarray使用

    1.利用xarray导入tif格式的DEM影像,并让其可视化. 参考博客:主要文章和博客1及博客2. 代码如下: 首先导入相关的包: import numpy as np import matplot ...

  6. c++下Gdal将16bit的tif图像转8bit

    c++下Gdal将16bit的tif图像转8bit [使用软件及版本]Gdal4.x(含proj等),vs2019 打包完的,到手即用. 头文件(仅罗列关键文件,其他基础自行添加) #include ...

  7. java 导出csv 格式,java导出csv格式文件的方法

    这篇文章主要为大家详细介绍了java导出csv格式文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 导出csv格式文件的本质是导出以逗号为分隔的文本数据 imp ...

  8. java是什么格式_是java格式

    错误:编码GBK的不可映射字符的解决办法 最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后 ...

  9. opencv-python将.tif格式的图像转为png格式

    在做UNET的眼球血管分割的时候,眼球的图像使用的tif格式存储的,习惯了使用jpg或者png了,先转一下.直接用opencv读进来以后重写一下就可以. # !/usr/bin/python3 # - ...

最新文章

  1. thymeleaf+layui 展示table 报500
  2. Aix /etc/hosts.equiv 文件的用途及用法
  3. AI:2020年6月22日北京智源大会演讲分享之10:40-11:30 Zoubin教授《Probabilistic Machine Learning and AI》
  4. Linux 设备模型之 (kobject、kset 和 Subsystem)(二)
  5. occam‘s razor
  6. python绘制直角坐标系_小白学 Python 数据分析(16):Matplotlib(一)坐标系
  7. oracle独立事务,Oracle中独立事务的处理
  8. java虚拟机06-内存分区/新生代、老年代
  9. TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇...
  10. 为.netcore助力--WebApiClient正式发布core版本
  11. PyTorch:存储和恢复模型并查看参数,load_state_dict(),state_dict()
  12. 利用Android属性动画实现Banner的原理与实践
  13. 换了一个皮肤,心情也好多了
  14. Tensorflow保存神经网络参数有妙招:Saver和Restore
  15. 铁甲雄兵显示服务器维护,《铁甲雄兵》5月17日09:00停机维护公告
  16. Tomcat URL重写
  17. 第三回 Bootstrap3.x 起步
  18. Python 3 mysql 简介安装
  19. wpf之内容超出布局是用滚动条
  20. 互联网晚报 | 7月10日 星期天 | 快手官宣:7月18日周杰伦独家直播;​400亿额度,秒光!7月总票房破10亿...

热门文章

  1. 01.query的分类-条件查询和组合查询
  2. 【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
  3. android项目出现红色大感叹号的问题解决方法
  4. php判断端口跳转,PHP判断端口是否打开的代码
  5. python for in语句 index_使用for循环查找句子中的单词及其索引位置
  6. python考试编程题九道_一道逻辑推理题的程序实现(纯属娱乐)
  7. java调用存储过程 sql server_Java中调用SQL Server存储过程示例
  8. oracle vm virtualbox 无法安装mac,【总结】在VirtualBox上面安装Mac的注意事项
  9. java string.join找不到_Java String join()用法及代码示例
  10. mysql查询递增列_mysql在查询结果列表前添加一列递增的序号列(最简)