这几天研究图像处理过程接触的腐蚀膨胀操作,要找个java源码参考都比较困难,所以自己写了java实现代码,并添加了阈值判断功能。可以手动修改结构元素以或者局部小改动得到不同的效果。欢迎交流指正!(PS:open我是在jframe类里面调用方便显示“sourceImage=Image_Utility.arrayToGreyImage(Image_Utility.open(Image_Utility.imageToArray(sourceImage),50)); ”)

import java.awt.image.BufferedImage;

/**

* 图像辅助类

* @author Administrator

*

*/

public class Image_Utility {

///结构元素

private static int sData[]={

0,0,0,

0,1,0,

0,1,1

};

/**

* 图像的开运算: 先腐蚀再膨胀

* @param sourceImage 此处处理灰度图像或者二值图像

* @param shreshold :阈值————当膨胀结果小于阈值时,仍然设置图像位置的值为0;而进行腐蚀操作时,

* 当灰度值大于等于阈值(小于阈值)时并且结构元素为1(0)时,才认为对应位置匹配上;

* 如果为二值图像,则应该传入1。

* @return

*/

public static int[][] open(int [][]source,int threshold){

int width=source[0].length;

int height=source.length;

int[][] result=new int[height][width];

///先腐蚀运算

result=correde(source, threshold);

///后膨胀运算

result=dilate(result, threshold);

/*for(int j=0;j

for(int i=0;i

System.out.print(result[j][i]+",");

}

System.out.println();

}

*/

return result;

}

/**

* 腐蚀运算

* @param source

* @param shreshold 当灰度值大于阈值(小于阈值)时并且结构元素为1(0)时,才认为对应位置匹配上;

* @return

*/

private static int[][] correde(int[][] source,int threshold){

int width=source[0].length;

int height=source.length;

int[][] result=new int[height][width];

for(int i=0;i

for(int j=0;j

///边缘不进行操作,边缘内才操作

if(i>0&&j>0&&i

int max =0;

///对结构元素进行遍历

for(int k=0;k

int x=k/3;///商表示x偏移量

int y=k%3;///余数表示y偏移量

if(sData[k]!=0){

///不为0时,必须全部大于阈值,否则就设置为0并结束遍历

if(source[i-1+x][j-1+y]>=threshold){

if(source[i-1+x][j-1+y]>max){

max=source[i-1+x][j-1+y];

}

}else{

与结构元素不匹配,赋值0,结束遍历

max=0;

break;

}

}

}

此处可以设置阈值,当max小于阈值的时候就赋为0

result[i][j]=max;

}else{

///直接赋值

result[i][j]=source[i][j];

}///end of the most out if-else clause .

}

}///end of outer for clause

return result;

}

/**

* 膨胀运算

* @param source

* @param threshold 当与运算结果值小于阈值时,图像点的值仍然设为0

* @return

*/

private static int[][] dilate(int[][] source,int threshold){

int width=source[0].length;

int height=source.length;

int[][] result=new int[height][width];

for(int i=0;i

for(int j=0;j

///边缘不进行操作

if(i>0&&j>0&&i

int max =0;

///对结构元素进行遍历

for(int k=0;k

int x=k/3;///商表示x偏移量

int y=k%3;///余数表示y偏移量

if(sData[k]!=0){

///当结构元素中不为0时,取出图像中对应各项的最大值赋给图像当前位置作为灰度值

if(source[i-1+x][j-1+y]>max){

max=source[i-1+x][j-1+y];

}

}

}

此处可以设置阈值,当max小于阈值的时候就赋为0

if(max

result[i][j]=0;

}else{

result[i][j]=max;

}

//result[i][j]=max;

}else{

///直接赋值

result[i][j]=source[i][j];

}

}

}

return result;

}

/**

* 灰度图像提取数组

* @param image

* @return int[][]数组

*/

public static int[][] imageToArray(BufferedImage image){

int width=image.getWidth();

int height=image.getHeight();

int[][] result=new int[height][width];

for(int j=0;j

for(int i=0;i

int rgb=image.getRGB(i, j);

int grey=(rgb>>16)&0xFF;

//System.out.println(grey);

result[j][i]=grey;

}

}

return result ;

}

/**

* 数组转为灰度图像

* @param sourceArray

* @return

*/

public static BufferedImage arrayToGreyImage(int[][] sourceArray){

int width=sourceArray[0].length;

int height=sourceArray.length;

BufferedImage targetImage=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

for(int j=0;j

for(int i=0;i

int greyRGB=sourceArray[j][i];

int rgb=(greyRGB<<16)|(greyRGB<<8)|greyRGB;

targetImage.setRGB(i, j, rgb);

}

}

return targetImage;

}

}

原理可以参考网友的博文​http://www.cnblogs.com/slysky/archive/2011/10/16/2214015.html

java图像膨胀_java实现的图像腐蚀、膨胀运算 | 学步园相关推荐

  1. java biginteger使用_java中的BigInteger的基本用法 | 学步园

    注 : 为了更好的理解BigInteger类,特提供了一篇关于BigInteger的题目及本人的解答,感兴趣的朋友可以到我的博客看一下 import java.math.BigInteger; pub ...

  2. java dll 乱码_java调用c++ dll出现中文乱码 | 学步园

    最近的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C++代码对文件进行操作.在调用中如果路径中包含有中文字符就会出现问题,程序运行就会中止.下面用一个小例子,来说明记录下 ...

  3. java 栈 泛型_java 泛型栈(数组实现) | 学步园

    尝试将一些数据结构用java实现,尝试过程中确实碰到一些问题,收获很大import java.lang.reflect.Array; class ArrayStack { Class type; pr ...

  4. java ip 国家_java通过ip获取用户所在国家 | 学步园

    什么是GeoIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息的一个数据库.GeoIP有两个版本,一个免费版,一个收费版本.收费版本的准确率和数据更 ...

  5. java web定时器_java的web项目中使用定时器 | 学步园

    之前接触过程序中的定时任务,但是没去自己亲自尝试过.终于这次抽空搞了一下.(一定要自己去操作,才能长经验,光看到过是没用的) 以下是两种方法,我使用的是监听的方法. JAVA WEB定时器,定时器的启 ...

  6. java 腐蚀 膨胀_Java+opencv3.2.0之膨胀与腐蚀

    腐蚀与膨胀是最基本的形态学操作,它们能够实现多种多样的功能,主要如下: 1) 消除噪声 2) 分割出独立的图像元素,在图像中连接相邻的元素 3) 寻找图像中的明显的极大值区域或极小值区域 4) 求出图 ...

  7. java 验证码 算术_java生成图形验证码(算数运算图形验证码 + 随机字符图形验证码)...

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  8. java 启动加载顺序_Java 程序的加载运行过程 | 学步园

    为了叙述方便,我写了个小例子 class Three{ private static int s3 = getS3(); private int y = getY(); public Three(){ ...

  9. java 校验文件类型_java如何判断一个文件的类型 | 学步园

    用文件头判断.直接读取文件的前几个字节. 常用文件的文件头如下: JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:47494638 ...

最新文章

  1. C语言网络编程:bind函数详解
  2. “提高一下dotnet程序的效率一”中关于exception的问题
  3. 【今晚七点半】:5G时代的云游戏还缺什么?
  4. linux 删除node进程,关于node.js:杀死Linux中的节点进程
  5. 程序员终结者还是“白嫖”开源代码?GitHub推出的AI编程辅助工具陷入争议
  6. 低脂肪肉能帮你减肥吗?
  7. 分享一个SQL文件的合并的小程序
  8. 写python程序最佳实践_Python后台程序打包最佳实践
  9. DBPN:Deep Back-Projection Networks For Super-Resolution
  10. Server(Iocp)的那些烦恼
  11. L1-023 输出GPLT (20分) 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分
  12. 邮件撤回怎么操作?个人邮箱Outlook登录入口在哪?
  13. 深入理解OkHttp3:(六)Https
  14. 遥感数据在植物识别的应用
  15. 经济与金融大数据挖掘——知识点总结回顾
  16. IMPERVA-WAF 设备替换方案
  17. FILETIME to DateTime
  18. IE 浏览器中不能使remove删除节点的解决方法
  19. python读文件完整代码_Python读写文件的代码示例
  20. 基于android的记账APP大作业项目

热门文章

  1. launch images source启动图删除后上下有黑边
  2. C++ string和c类型字符数组的比较
  3. C/C++ SQLite 之基础篇
  4. 软件LoadRunner 产品信息(product information)
  5. MEF程序设计指南(转)
  6. [导入]SQL Injection cheat sheet
  7. Python之进程+线程+协程(进程的本质 与 threading线程模块)
  8. winformbutton边框怎么改_C#(winform)为button添加背景图片,并去掉各种边框
  9. xlwings 合并单元格 读取_将16家公司财务报表数据过入合并底稿表格,我只用了1分钟...
  10. java的text函数,excel text函数以及相关的函数使用方法