前些时候做毕业设计
用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];
fsread(bf bfLen); // 读取字节BMP文件头
int biLen = ;
byte bi[] = new byte[biLen];
fsread(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];
fsread(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 = ToolkitgetDefaultToolkit();
// image = kitcreateImage(new MemoryImageSource(nWidth nHeight
// nData nWidth));
/*
//调试数据的读取
FileWriter fw = new FileWriter(C:\\Documents and Settings\\Administrator\\My Documents\\nDataRawtxt);//创建新文件
PrintWriter out = new PrintWriter(fw);
for(int j=;j<nHeight;j++){
for(int i=;i<nWidth;i++){
outprint((*+nData[nWidth * (nHeight j ) + i])+_
+nR[nWidth * (nHeight j ) + i]+_
+nG[nWidth * (nHeight j ) + i]+_
+nB[nWidth * (nHeight j ) + i]+ );
}
outprintln();
}
outclose();
*/
}
}
catch (Exception e) {
eprintStackTrace();
throw new Exception(e);
}
finally {
if (fs != null) {
fsclose();
}
}
// return image;
}
二由r g b 获取灰度数组
public int[] getBrightnessData(int rData[]int gData[]int bData[]){
int brightnessData[]=new int[rDatalength];
if(rDatalength!=gDatalength || rDatalength!=bDatalength
|| bDatalength!=gDatalength){
return brightnessData;
}
else {
for(int i=;i<bDatalength;i++){
double temp=*rData[i]+*gData[i]+*bData[i];
brightnessData[i]=(int)(temp)+((temp(int)(temp))>?:);
}
return brightnessData;
}
}
三 直方图均衡化
public int [] equilibrateGray(int[] PixelsGrayint widthint height)
{
int gray;
int length=PixelsGraylength;
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[] laplaceDFileter(int []dataint widthint height){
int filterData[]=new int[datalength];
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];
}
}
// Systemoutprintln(max: +max);
// Systemoutprintln(min: +min);
for(int i=;i<width*height;i++){
filterData[i]=(filterData[i]min)*/(maxmin);
}
return filterData;
}
五 laplace阶增强滤波增强边缘增强系数delt
public int[] laplaceHighDFileter(int []dataint widthint heightdouble delt){
int filterData[]=new int[datalength];
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)*/(maxmin);
}
return filterData;
}
六 局部阈值处理值化
// 局部阈值处理值化niblacks method
/*原理
T(xy)=m(xy) + k*s(xy)
取一个宽度为w的矩形框(xy)为这个框的中心
统计框内数据T(xy)为阈值m(xy)为均值s(xy)为均方差k为参数(推荐)计算出t再对(xy)进行切割/
这个算法的优点是 速度快效果好
缺点是 niblacks method会产生一定的噪声
*/
public int[] localThresholdProcess(int []dataint widthint heightint wint hdouble coefficientsdouble gate){
int[] processData=new int[datalength];
for(int i=;i<datalength;i++){
processData[i]=;
}
if(datalength!=width*height)
return processData;
int wNum=width/w;
int hNum=height/h;
int delt[]=new int[w*h];
//Systemoutprintln(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];
//Systemoutprint(delt[+(n*w+k)+]: +delt[n*w+k]+ );
}
//Systemoutprintln();
/*
for(int n=;n<h;n++)
for(int k=;k<w;k++){
Systemoutprint(data[+((j*h+n)*width+i*w+k)+]: +data[(j*h+n)*width+i*w+k]+ );
}
Systemoutprintln();
*/
delt=thresholdProcess(deltwhcoefficientsgate);
for(int n=;n<h;n++)
for(int k=;k<w;k++){
processData[(j*h+n)*width+i*w+k]=delt[n*w+k];
// Systemoutprint(delt[+(n*w+k)+]: +delt[n*w+k]+ );
}
//Systemoutprintln();
/*
for(int n=;n<h;n++)
for(int k=;k<w;k++){
Systemoutprint(processData[+((j*h+n)*width+i*w+k)+]: +processData[(j*h+n)*width+i*w+k]+ );
}
Systemoutprintln();
*/
}
}
return processData;
}
七 全局阈值处理值化
public int[] thresholdProcess(int []dataint widthint heightdouble coefficientsdouble gate){
int [] processData=new int[datalength];
if(datalength!=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=Mathsqrt(variance);
threshold=averagecoefficients*variance;
}
for(int i=;i<width*height;i++){
if(data[i]>threshold)
processData[i]=;
else
processData[i]=;
}
return processData;
}
}
八 垂直边缘检测sobel算子
public int[] verticleEdgeCheck(int []dataint widthint heightint sobelCoefficients) throws Exception{
int filterData[]=new int[datalength];
int min=;
int max=;
if(datalength!=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]Mathsqrt()*data[i*width+j]+Mathsqrt()*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)*/(maxmin);
}
}
catch (Exception e)
{
eprintStackTrace();
throw new Exception(e);
}
return filterData;
}
九 图像平滑*掩模处理(平均处理)降低噪声
public int[] filter(int []dataint widthint height) throws Exception{
int filterData[]=new int[datalength];
int min=;
int max=;
if(datalength!=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]+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+])/;
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)*/(maxmin);
}
}
catch (Exception e)
{
eprintStackTrace();
throw new Exception(e);
}
return filterData;
}