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;j0&&j>0&&i=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;i0&&j>0&&imax){
								max=source[i-1+x][j-1+y];
							}
						}
					}
					
					
					此处可以设置阈值,当max小于阈值的时候就赋为0
					if(max>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
原理可以参考网友的博文 http://www.cnblogs.com/slysky/archive/2011/10/16/2214015.html

你可能感兴趣的:(图像处理,java)