「java写阈值」代码阈值
本篇文章给大家谈谈java写阈值,以及代码阈值对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java数字图像处理常用算法
- 2、我想把一个黑白的线条的手绘图片转换成一个矩阵存储,黑用0,白用1,请问用java如何实现
- 3、Java中split的用法
- 4、Sku超量阈值设置 java怎么实现
- 5、Java随机生成颜色
- 6、JAVA怎么中断IO阻塞的线程
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= ;jnHeight;j++){ for(int i= ;inWidth;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= ;ibData 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= ;iheight;i++) { for(int j= ;jwidth;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= ;iheight;i++){ for(int j= ;jwidth;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= ;iwidth*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= ;iheight;i++){ for(int j= ;jwidth;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= ;iwidth*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= ;idata 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= ;jhNum;j++){ for(int i= ;iwNum;i++){ //for(int j= ;j ;j++){ // for(int i= ;i ;i++){ for(int n= ;nh;n++) for(int k= ;kw;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= ;nh;n++) for(int k= ;kw;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= ;nh;n++) for(int k= ;kw;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= ;nh;n++) for(int k= ;kw;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= ;iwidth*height;i++){ sum+=data[i]; } average=sum/(width*height); for(int i= ;iwidth*height;i++){ variance+=(data[i] average)*(data[i] average); } variance=Math sqrt(variance); threshold=average coefficients*variance; } for(int i= ;iwidth*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= ;iheight;i++){ for(int j= ;jwidth;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= ;iwidth*height;i++){ filterData[i]=(filterData[i] min)* /(max min); } } catch (Exception e) { e printStackTrace(); throw new Exception(e); } return filterData; }
九 图像平滑 * 掩模处理(平均处理) 降低噪声
lishixinzhi/Article/program/Java/hx/201311/26286
我想把一个黑白的线条的手绘图片转换成一个矩阵存储,黑用0,白用1,请问用java如何实现
import java.io.File;
import java.io.FileInputStream;
public class Test {
/**
* 将图片转成0/1矩阵
* @param imagePath
* @return
* @throws IOException
*/
public int[][] imgMtr(String imagePath) throws Exception {
java.awt.image.BufferedImage image =
javax.imageio.ImageIO.read(new FileInputStream(new File(imagePath)));
int w = image.getWidth();
int h = image.getHeight();
int[][] mtr = new int[h][w]; // 存储矩阵
for (int i = 0; i h; i++) {
for (int j = 0; j w; j++) {
int rgb = image.getRGB(j, i); //aRGB
// 依次检查R、G、B是否超过阈值
// 超过视为白色,否则黑色
int r = (rgb 0x00ff0000) 16;
int g = (rgb 0x0000ff00) 8;
int b = (rgb 0x000000ff);
int a = 0xff / 2; //阈值, 可根据需要设定
if (r a g a b a) {
mtr[i][j] = 1;
} else {
mtr[i][j] = 0;
}
}
}
return mtr;
}
public static void main(String[] args) throws Exception {
Test test = new Test();
int[][] result = test.imgMtr("F:\\hex.jpg");
for (int[] row : result) {
for (int col : row) {
System.out.print(col);
}
System.out.print("\n");
}
}
}
Java中split的用法
Java中split主要用于分隔字符串。
具体分析如下:
1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split(".")。
2、如果用“|”作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.split("|"),“.”和“|”都是转义字符,必须得加"\\"。
3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如,“acount=? and uu =? or n=?”,把三个都分隔出来,可以用String.split("and|or")。
扩展资料:
Java中split使用注意事项:
1、要被分解的String对象或文字,该对象不会被split方法修改。
2、字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。
3、该值用来限制返回数组中的元素个数(也就是最多分割成几个数组元素,只有为正数时有影响)。
4、split 方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解。separator不作为任何数组元素的部分返回。
Sku超量阈值设置 java怎么实现
较为常用的图像二值化方法有:1)全局固定阈值;2)局部自适应阈值;3)OTSU等。局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处在于每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小。不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。常用的局部自适应阈值有:1)局部邻域块的均值;2)局部邻域块的高斯加权和。
Java随机生成颜色
说下思路,不一定对,随机颜色的化,每次随机三个 0到255的数字,组合成一个RGB,应该就可以了,现在的问题是,区分颜色之间的鲜明程度。定义一个阈值A
A= (r1-r2)^2+(g1-g2)^2+(b1-b2)^2 根据这样来计算,每生成一种颜色,就把这种颜色跟其余颜色的阈值计算出来,如果全都满足,那么就可以,如果有一个不满足,那就重新随机生成一次。
A具体的值是多少,这个你可以摸索下,设置太大的化,随机生成的颜色的数量,可能不够,太小的化,颜色的鲜明程度不满足。
实际上,上面A的公式来计算 颜色的鲜明程度 是错误的,不能这样算。
JAVA怎么中断IO阻塞的线程
1、写程序的关键是要有控制流,当程序块中的处理涉及到死循环的时候更要加量的控制。
2、像这种情况,两个步骤,
一,为IO时的创建线程,加一个数量的阈值,超过它后则不再创建。
二,为每个线程设置标志变量标志该线程是否已经束,或是直接加入线程组去管理。
3、回看你的程序需求,明显设计不合理。其实应当创建一个线程池去搞定这个业务需求。
再想想吧。
关于java写阈值和代码阈值的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。