java图像膨胀_java实现的图像腐蚀、膨胀运算 | 学步园
这几天研究图像处理过程接触的腐蚀膨胀操作,要找个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实现的图像腐蚀、膨胀运算 | 学步园相关推荐
- java biginteger使用_java中的BigInteger的基本用法 | 学步园
注 : 为了更好的理解BigInteger类,特提供了一篇关于BigInteger的题目及本人的解答,感兴趣的朋友可以到我的博客看一下 import java.math.BigInteger; pub ...
- java dll 乱码_java调用c++ dll出现中文乱码 | 学步园
最近的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C++代码对文件进行操作.在调用中如果路径中包含有中文字符就会出现问题,程序运行就会中止.下面用一个小例子,来说明记录下 ...
- java 栈 泛型_java 泛型栈(数组实现) | 学步园
尝试将一些数据结构用java实现,尝试过程中确实碰到一些问题,收获很大import java.lang.reflect.Array; class ArrayStack { Class type; pr ...
- java ip 国家_java通过ip获取用户所在国家 | 学步园
什么是GeoIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息的一个数据库.GeoIP有两个版本,一个免费版,一个收费版本.收费版本的准确率和数据更 ...
- java web定时器_java的web项目中使用定时器 | 学步园
之前接触过程序中的定时任务,但是没去自己亲自尝试过.终于这次抽空搞了一下.(一定要自己去操作,才能长经验,光看到过是没用的) 以下是两种方法,我使用的是监听的方法. JAVA WEB定时器,定时器的启 ...
- java 腐蚀 膨胀_Java+opencv3.2.0之膨胀与腐蚀
腐蚀与膨胀是最基本的形态学操作,它们能够实现多种多样的功能,主要如下: 1) 消除噪声 2) 分割出独立的图像元素,在图像中连接相邻的元素 3) 寻找图像中的明显的极大值区域或极小值区域 4) 求出图 ...
- java 验证码 算术_java生成图形验证码(算数运算图形验证码 + 随机字符图形验证码)...
平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...
- java 启动加载顺序_Java 程序的加载运行过程 | 学步园
为了叙述方便,我写了个小例子 class Three{ private static int s3 = getS3(); private int y = getY(); public Three(){ ...
- java 校验文件类型_java如何判断一个文件的类型 | 学步园
用文件头判断.直接读取文件的前几个字节. 常用文件的文件头如下: JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:47494638 ...
最新文章
- C语言网络编程:bind函数详解
- “提高一下dotnet程序的效率一”中关于exception的问题
- 【今晚七点半】:5G时代的云游戏还缺什么?
- linux 删除node进程,关于node.js:杀死Linux中的节点进程
- 程序员终结者还是“白嫖”开源代码?GitHub推出的AI编程辅助工具陷入争议
- 低脂肪肉能帮你减肥吗?
- 分享一个SQL文件的合并的小程序
- 写python程序最佳实践_Python后台程序打包最佳实践
- DBPN:Deep Back-Projection Networks For Super-Resolution
- Server(Iocp)的那些烦恼
- L1-023 输出GPLT (20分) 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分
- 邮件撤回怎么操作?个人邮箱Outlook登录入口在哪?
- 深入理解OkHttp3:(六)Https
- 遥感数据在植物识别的应用
- 经济与金融大数据挖掘——知识点总结回顾
- IMPERVA-WAF 设备替换方案
- FILETIME to DateTime
- IE 浏览器中不能使remove删除节点的解决方法
- python读文件完整代码_Python读写文件的代码示例
- 基于android的记账APP大作业项目
热门文章
- launch images source启动图删除后上下有黑边
- C++ string和c类型字符数组的比较
- C/C++ SQLite 之基础篇
- 软件LoadRunner 产品信息(product information)
- MEF程序设计指南(转)
- [导入]SQL Injection cheat sheet
- Python之进程+线程+协程(进程的本质 与 threading线程模块)
- winformbutton边框怎么改_C#(winform)为button添加背景图片,并去掉各种边框
- xlwings 合并单元格 读取_将16家公司财务报表数据过入合并底稿表格,我只用了1分钟...
- java的text函数,excel text函数以及相关的函数使用方法