本文目錄一覽:
- 1、java中BufferedImage圖像有哪幾種類型?
- 2、java數字圖像處理常用演算法
- 3、java中圖像與數組轉換
- 4、Java圖像去噪怎麼實現?
- 5、Java支持的圖像文件格式?
- 6、如何用java轉換圖像格式為jpg
java中BufferedImage圖像有哪幾種類型?
Java的BufferedImage類是Image類的子類。屬於一種類型,它是用來處理和操作的圖像數據。
構造函數構造一個新BufferedImage一個具有指定ColorModel和Raster。
它計算的任意矩形區域BufferedImage並將其複製到指定的WritableRaster。
構造函數構造一個BufferedImage預定義圖像類型之一,TYPE_BYTE_BINARY或TYPE_BYTE_INDEXED。
它返回默認RGB顏色模型(TYPE_INT_ARGB)和默認sRGB色彩空間中的整數像素。
Java是一種高級編程語言被廣泛使用在現代世界。 它可以支持和處理的數字圖像處理有效地使用各種功能。
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
java中圖像與數組轉換
按照你的要求編寫的Java程序如下:( 要注意的地方見語句後面的注釋)
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageWithArray {
public static void main(String[] args) {
// 讀取圖片到BufferedImage
BufferedImage bf = readImage(“c:\\tmp\\6\\female.png”);//這裡寫你要讀取的絕對路徑+文件名
// 將圖片轉換為二維數組
int[][] rgbArray1 = convertImageToArray(bf);
// 輸出圖片到指定文件
writeImageFromArray(“c:\\tmp\\2.png”, “png”, rgbArray1);//這裡寫你要輸出的絕對路徑+文件名
System.out.println(“圖片輸出完畢!”);
}
public static BufferedImage readImage(String imageFile){
File file = new File(imageFile);
BufferedImage bf = null;
try {
bf = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
return bf;
}
public static int[][] convertImageToArray(BufferedImage bf) {
// 獲取圖片寬度和高度
int width = bf.getWidth();
int height = bf.getHeight();
// 將圖片sRGB數據寫入一維數組
int[] data = new int[width*height];
bf.getRGB(0, 0, width, height, data, 0, width);
// 將一維數組轉換為為二維數組
int[][] rgbArray = new int[height][width];
for(int i = 0; i height; i++)
for(int j = 0; j width; j++)
rgbArray[i][j] = data[i*width + j];
return rgbArray;
}
public static void writeImageFromArray(String imageFile, String type, int[][] rgbArray){
// 獲取數組寬度和高度
int width = rgbArray[0].length;
int height = rgbArray.length;
// 將二維數組轉換為一維數組
int[] data = new int[width*height];
for(int i = 0; i height; i++)
for(int j = 0; j width; j++)
data[i*width + j] = rgbArray[i][j];
// 將數據寫入BufferedImage
BufferedImage bf = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
bf.setRGB(0, 0, width, height, data, 0, width);
// 輸出圖片
try {
File file= new File(imageFile);
ImageIO.write((RenderedImage)bf, type, file);
} catch (IOException e) {
e.printStackTrace();
}
}
}
運行結果:
圖片輸出完畢!
原圖:
輸出圖:
Java圖像去噪怎麼實現?
流程不外乎是
讀取圖像文件;
掃描噪點;
去除噪點;
保存圖像文件。
Java2D操作好像使用BufferedImage讀取圖像文件最方便,有一陣沒弄這了,忘了。應該可以讀取JPG,PNG,GIF圖像。
識別噪點應該有專門的演算法,我沒研究過,百度一下應該能找到專門演算法,然後寫段代碼就可以。我個人以為是獨立一個像素與周圍一定範圍內的像素差異過大,就認為是噪點。可以有亮度,色相上的差別。BufferedImage可以讀取每個像素的RGB,從而能識別色相的差別;還有個矩陣,用來由RGB計算亮度的,也就可以計算亮度差別了,這個網上都能找到。
輸出也使用BufferedImage就可以。
關鍵是每個像素都要和周圍像素比較,還要計算亮度,最少是三重循環了,如何提高效率是個大問題了。這個代碼寫好了也算一個高手了。
Java支持的圖像文件格式?
java1.0支持顯示gif和jpeg格式的圖像文件,這些文件的擴展名為.gif、.jpg或.jpeg。在java.awt.image包、java.awt包和java.applet包中都有對圖像的支持
如何用java轉換圖像格式為jpg
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
public class ImageFormat {
public static void main(String[] args) {
File file = new File(“c:\\test.jpg”);
changFormat(file, “png”, new File(“c:\\test.png”));// 轉為png
changFormat(file, “bmp”, new File(“c:\\test.bmp”));// 轉為bmp
//changFormat(file, “jpeg”, new File(“c:\\test.jpg”));// 轉為jpg
changFormat(file, “gif”, new File(“c:\\test.gif”));// 轉為gif
}
//第一個參數 原圖的File對象 第二個參數 目標格式 第三個參數 輸出圖像的File對象
public static void changFormat(File srcFile, String format, File formatFile) {
try {
BufferedImage srcImg = ImageIO.read(srcFile);// 讀取原圖
ImageIO.write(srcImg, format, formatFile);// 用指定格式輸出到指定文件
} catch (IOException e) {
e.printStackTrace();
}
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/153001.html