知识大全 java数字图像处理常用算法
Posted 阈值
篇首语:会当凌绝顶,一览众山小。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java数字图像处理常用算法相关的知识,希望对你有一定的参考价值。
前些时候做毕业设计 用java做的数字图像处理方面的东西 这方面的资料ms比较少 发点东西上来大家共享一下 主要就是些算法 有自己写的 有人家的 还有改人家的 有的算法写的不好 大家不要见笑一 读取bmp图片数据
// 获取待检测图像 数据保存在数组 nData[] nB[] nG[] nR[]中
public void getBMPImage(String source) throws Exception clearNData(); //清除数据保存区 FileInputStream fs = null; try fs = new FileInputStream(source); int bfLen = ; byte bf[] = new byte[bfLen]; fs read(bf bfLen); // 读取 字节BMP文件头 int biLen = ; byte bi[] = new byte[biLen]; fs read(bi biLen); // 读取 字节BMP信息头
// 源图宽度 nWidth = (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (int) bi[ ] & xff;
// 源图高度 nHeight = (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (int) bi[ ] & xff;
// 位数 nBitCount = (((int) bi[ ] & xff) << ) | (int) bi[ ] & xff;
// 源图大小 int nSizeImage = (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (((int) bi[ ] & xff) << ) | (int) bi[ ] & xff;
// 对 位BMP进行解析 if (nBitCount == ) int nPad = (nSizeImage / nHeight) nWidth * ; nData = new int[nHeight * nWidth]; nB=new int[nHeight * nWidth]; nR=new int[nHeight * nWidth]; nG=new int[nHeight * nWidth]; byte bRGB[] = new byte[(nWidth + nPad) * * nHeight]; fs read(bRGB (nWidth + nPad) * * nHeight); int nIndex = ; for (int j = ; j < nHeight; j++) for (int i = ; i < nWidth; i++) nData[nWidth * (nHeight j ) + i] = ( & xff) << | (((int) bRGB[nIndex + ] & xff) << ) | (((int) bRGB[nIndex + ] & xff) << ) | (int) bRGB[nIndex] & xff; nB[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex]& xff; nG[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+ ]& xff; nR[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+ ]& xff; nIndex += ; nIndex += nPad; // Toolkit kit = Toolkit getDefaultToolkit(); // image = kit createImage(new MemoryImageSource(nWidth nHeight // nData nWidth));
/* //调试数据的读取
FileWriter fw = new FileWriter( C:\\\\Documents and Settings\\\\Administrator\\\\My Documents\\\\nDataRaw txt );//创建新文件 PrintWriter out = new PrintWriter(fw); for(int j= ;j<nHeight;j++) for(int i= ;i<nWidth;i++) out print(( * +nData[nWidth * (nHeight j ) + i])+ _ +nR[nWidth * (nHeight j ) + i]+ _ +nG[nWidth * (nHeight j ) + i]+ _ +nB[nWidth * (nHeight j ) + i]+ ); out println( ); out close();*/ catch (Exception e) e printStackTrace(); throw new Exception(e); finally if (fs != null) fs close(); // return image;
二 由r g b 获取灰度数组
public int[] getBrightnessData(int rData[] int gData[] int bData[]) int brightnessData[]=new int[rData length]; if(rData length!=gData length || rData length!=bData length || bData length!=gData length) return brightnessData; else for(int i= ;i<bData length;i++) double temp= *rData[i]+ *gData[i]+ *bData[i]; brightnessData[i]=(int)(temp)+((temp (int)(temp))> ? : ); return brightnessData;
三 直方图均衡化
public int [] equilibrateGray(int[] PixelsGray int width int height) int gray; int length=PixelsGray length; int FrequenceGray[]=new int[length]; int SumGray[]=new int[ ]; int ImageDestination[]=new int[length]; for(int i = ; i <length ;i++) gray=PixelsGray[i]; FrequenceGray[gray]++; // 灰度均衡化 SumGray[ ]=FrequenceGray[ ]; for(int i= ;i< ;i++) SumGray[i]=SumGray[i ]+FrequenceGray[i]; for(int i= ;i< ;i++) SumGray[i]=(int)(SumGray[i]* /length); for(int i= ;i<height;i++) for(int j= ;j<width;j++) int k=i*width+j; ImageDestination[k]= xFF | ((SumGray[PixelsGray[k]]<< ) | (SumGray[PixelsGray[k]]<< ) | SumGray[PixelsGray[k]]); return ImageDestination;
四 laplace 阶滤波 增强边缘 图像锐化
public int[] laplace DFileter(int []data int width int height) int filterData[]=new int[data length]; int min= ; int max= ; for(int i= ;i<height;i++) for(int j= ;j<width;j++) if(i== || i==height || j== || j==width ) filterData[i*width+j]=data[i*width+j]; else filterData[i*width+j]= *data[i*width+j] data[i*width+j ] data[i*width+j+ ] data[(i )*width+j] data[(i )*width+j ] data[(i )*width+j+ ] data[(i+ )*width+j] data[(i+ )*width+j ] data[(i+ )*width+j+ ]; if(filterData[i*width+j]<min) min=filterData[i*width+j]; if(filterData[i*width+j]>max) max=filterData[i*width+j]; // System out println( max: +max);// System out println( min: +min); for(int i= ;i<width*height;i++) filterData[i]=(filterData[i] min)* /(max min); return filterData;
五 laplace 阶增强滤波 增强边缘 增强系数delt
public int[] laplaceHigh DFileter(int []data int width int height double delt) int filterData[]=new int[data length]; int min= ; int max= ; for(int i= ;i<height;i++) for(int j= ;j<width;j++) if(i== || i==height || j== || j==width ) filterData[i*width+j]=(int)(( +delt)*data[i*width+j]); else filterData[i*width+j]=(int)(( +delt)*data[i*width+j] data[i*width+j ]) data[i*width+j+ ] data[(i )*width+j] data[(i )*width+j ] data[(i )*width+j+ ] data[(i+ )*width+j] data[(i+ )*width+j ] data[(i+ )*width+j+ ]; if(filterData[i*width+j]<min) min=filterData[i*width+j]; if(filterData[i*width+j]>max) max=filterData[i*width+j]; for(int i= ;i<width*height;i++) filterData[i]=(filterData[i] min)* /(max min); return filterData; 六 局部阈值处理 值化
// 局部阈值处理 值化 niblack s method /*原理 T(x y)=m(x y) + k*s(x y) 取一个宽度为w的矩形框 (x y)为这个框的中心 统计框内数据 T(x y)为阈值 m(x y)为均值 s(x y)为均方差 k为参数(推荐 )计算出t再对(x y)进行切割 / 这个算法的优点是 速度快 效果好 缺点是 niblack s method会产生一定的噪声 */ public int[] localThresholdProcess(int []data int width int height int w int h double coefficients double gate) int[] processData=new int[data length]; for(int i= ;i<data length;i++) processData[i]= ; if(data length!=width*height) return processData; int wNum=width/w; int hNum=height/h; int delt[]=new int[w*h]; //System out println( w; +w+ h: +h+ wNum: +wNum+ hNum: +hNum); for(int j= ;j<hNum;j++) for(int i= ;i<wNum;i++) //for(int j= ;j< ;j++) // for(int i= ;i< ;i++) for(int n= ;n<h;n++) for(int k= ;k<w;k++) delt[n*w+k]=data[(j*h+n)*width+i*w+k]; //System out print( delt[ +(n*w+k)+ ]: +delt[n*w+k]+ ); //System out println(); /* for(int n= ;n<h;n++) for(int k= ;k<w;k++) System out print( data[ +((j*h+n)*width+i*w+k)+ ]: +data[(j*h+n)*width+i*w+k]+ ); System out println(); */ delt=thresholdProcess(delt w h coefficients gate); for(int n= ;n<h;n++) for(int k= ;k<w;k++) processData[(j*h+n)*width+i*w+k]=delt[n*w+k]; // System out print( delt[ +(n*w+k)+ ]: +delt[n*w+k]+ ); //System out println(); /* for(int n= ;n<h;n++) for(int k= ;k<w;k++) System out print( processData[ +((j*h+n)*width+i*w+k)+ ]: +processData[(j*h+n)*width+i*w+k]+ ); System out println(); */ return processData;
七 全局阈值处理 值化
public int[] thresholdProcess(int []data int width int height double coefficients double gate) int [] processData=new int[data length]; if(data length!=width*height) return processData; else double sum= ; double average= ; double variance= ; double threshold; if( gate!= ) threshold=gate; else for(int i= ;i<width*height;i++) sum+=data[i]; average=sum/(width*height); for(int i= ;i<width*height;i++) variance+=(data[i] average)*(data[i] average); variance=Math sqrt(variance); threshold=average coefficients*variance; for(int i= ;i<width*height;i++) if(data[i]>threshold) processData[i]= ; else processData[i]= ; return processData;
八 垂直边缘检测 sobel算子
public int[] verticleEdgeCheck(int []data int width int height int sobelCoefficients) throws Exception int filterData[]=new int[data length]; int min= ; int max= ; if(data length!=width*height) return filterData; try for(int i= ;i<height;i++) for(int j= ;j<width;j++) if(i== || i== || i==height || i==height ||j== || j== || j==width || j==width ) filterData[i*width+j]=data[i*width+j]; else double average; //中心的九个像素点 //average=data[i*width+j] Math sqrt( )*data[i*width+j ]+Math sqrt( )*data[i*width+j+ ] average=data[i*width+j] sobelCoefficients*data[i*width+j ]+sobelCoefficients*data[i*width+j+ ] data[(i )*width+j ]+data[(i )*width+j+ ] data[(i+ )*width+j ]+data[(i+ )*width+j+ ]; filterData[i*width+j]=(int)(average); if(filterData[i*width+j]<min) min=filterData[i*width+j]; if(filterData[i*width+j]>max) max=filterData[i*width+j]; for(int i= ;i<width*height;i++) filterData[i]=(filterData[i] min)* /(max min); catch (Exception e) e printStackTrace(); throw new Exception(e); return filterData;
九 图像平滑 * 掩模处理(平均处理) 降低噪声
cha138/Article/program/Java/hx/201311/26286相关参考
Java中常用的加密算法MD5,SHA,RSA 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! M
Java常用的加密解密数字签名等API 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 常用API
Java通用权限控制算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一种常用的权限控制算法的
以下是一个用java演示的产生图像烟花的算法可以用来研究以下相关的东西希望对有兴趣的朋友有用 import javaappletAudioClip; import&nbs
一个简单直观的基数估计方法 让我们从一个简单直观的例子开始吧假设你通过如下步骤生成了一个数据集 随机生成n个服从均匀分布的数字 随便重复其中一些数字重复的数字和重复次数都不确定 打乱这些数
Java实现通用组合算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java实现通用组合算法
最近在面试遇到很多排序算法问题总结一下 定义数组如下 [java] int[]array=newint[]; int[]array=newint[]; 首先是插入排序 [java]
JAVA凸包算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 源码一JarvisMarchja
HITS算法Java实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! HITS算法是重要的链接
JAVA垃圾回收算法摘要 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 垃圾收集的算法分析 j