Java的图像处理代码 java图像处理opencv

java数字图像处理常用算法前些时候做毕业设计 用java做的数字图像处理方面的东西 这方面的资料ms比较少 发点东西上来大家共享一下 主要就是些算法 有自己写的 有人家的 还有改人家的 有的算法写的不好 大家不要见笑
一 读取bmp图片数据
//获取待检测图像数据保存在数组 nData[] nB[]nG[]nR[]中
publicvoid 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 = https://www.04ip.com/post/new int[nHeight * nWidth];nB=new int[nHeight * nWidth];nR=new int[nHeight * nWidth];nG=new int[nHeight * nWidth];byte bRGB[] = new byte[(nWidthnPad) * * nHeight];fs read(bRGB (nWidthnPad) * * nHeight);int nIndex = ;for (int j = ; jnHeight; j){for (int i = ; inWidth; 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 获取灰度数组
publicint[] 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];elsefilterData[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]);elsefilterData[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 smethod/*原理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 smethod会产生一定的噪声*/public int[] localThresholdProcess(int []data int width int height int w int h double coefficients double gate){int[] processData=https://www.04ip.com/post/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;wh:hwNum:wNumhNum: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=https://www.04ip.com/post/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]= ;elseprocessData[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代码模拟一张图片可以这样操作Java的图像处理代码:1.创建BufferedImage类
2.根据BufferedImage类得到一个Graphics2D对象
3.根据Graphics2D对象进行逻辑操作
4.处理绘图
5.将绘制好Java的图像处理代码的图片写入到图片
用java编写数字图像处理中的代码好不好写java基于图形处理Java的图像处理代码的类库也很强大Java的图像处理代码,建议查阅javaSE 的API , java学到最后拼的都是自学能力,针对不同领域的应用,有成千上万的类库等着Java的图像处理代码你去探索 。查查资料,看看API,一定能解决 。曾经用java写过简单的图形验证码 , 印象中好像写了100多行代码,这个应该算是最简单的了,至于你说的数字图像处理,这个概念很大Java的图像处理代码!建议从具体需求出发,所有问题都能迎刃而解 , 没有什么好不好写之说,只有想不想写之念
代码不长,java 图像处理 关天setRGB(x,y,rgb)不会?。?我试了一下图像是变化的,不过下边这段代码没太懂,为什么i和j要递增2呢?递增1的话感觉效果更有趣一些:)
for(i=0;iwidth-1;i =2)
for(j=0;jheight-1;j =2)
{pix=temp.getRGB(i,j);
if(pix!=im.getRGB(i,j))//每个相素进行比较如果不等
{im.setRGB(i,j,pix);//则更新为现在的像素值 。
}
}
关于java图像处理Java图像处理技巧四则
下面代码中用到的sourceImage是一个已经存在的Image对象
图像剪切
对于一个已经存在的Image对象,要得到它的一个局部图像,可以使用下面的步骤:
//import java.awt.*;
//import java.awt.image.*;
Image croppedImage;
ImageFilter cropFilter;
CropFilter =new CropImageFilter(25,30,75,75); //四个参数分别为图像起点坐标和宽高,即CropImageFilter(int x,int y,int width,int height),详细情况请参考API
CroppedImage= Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(sourceImage.getSource(),cropFilter));
如果是在Component的子类中使用,可以将上面的Toolkit.getDefaultToolkit().去掉 。FilteredImageSource是一个ImageProducer对象 。
图像缩放
对于一个已经存在的Image对象,得到它的一个缩放的Image对象可以使用Image的getScaledInstance方法:
Image scaledImage=sourceImage. getScaledInstance(100,100, Image.SCALE_DEFAULT); //得到一个100X100的图像
Image doubledImage=sourceImage. getScaledInstance(sourceImage.getWidth(this)*2,sourceImage.getHeight(this)*2, Image.SCALE_DEFAULT); //得到一个放大两倍的图像,这个程序一般在一个swing的组件中使用,而类Jcomponent实现了图像观察者接口ImageObserver,所有可以使用this 。
//其它情况请参考API
灰度变换
下面的程序使用三种方法对一个彩色图像进行灰度变换,变换的效果都不一样 。一般而言 , 灰度变换的算法是将象素的三个颜色分量使用R*0.3 G*0.59+ B*0.11得到灰度值,然后将之赋值给红绿蓝 , 这样颜色取得的效果就是灰度的 。另一种就是取红绿蓝三色中的最大值作为灰度值 。java核心包也有一种算法,但是没有看源代码,不知道具体算法是什么样的,效果和上述不同 。
/* GrayFilter.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class GrayFilter extends RGBImageFilter {
int modelStyle;
public GrayFilter() {
modelStyle=GrayModel.CS_MAX;
canFilterIndexColorModel=true;
}
public GrayFilter(int style) {
modelStyle=style;
canFilterIndexColorModel=true;
}
public void setColorModel(ColorModel cm) {
if (modelStyle==GrayModel
else if (modelStyle==GrayModel
}
public int filterRGB(int x,int y,int pixel) {
return pixel;
}
}
/* GrayModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class GrayModel extends ColorModel {
public static final int CS_MAX=0;
public static final int CS_FLOAT=1;
ColorModel sourceModel;
int modelStyle;
public GrayModel(ColorModel sourceModel) {
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;
modelStyle=0;
【Java的图像处理代码 java图像处理opencv】}
public GrayModel(ColorModel sourceModel,int style) {
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;
modelStyle=style;
}
public void setGrayStyle(int style) {
modelStyle=style;
}
protected int getGrayLevel(int pixel) {
if (modelStyle==CS_MAX) {
return Math.max(sourceModel.getRed(pixel),Math.max(sourceModel.getGreen(pixel),sourceModel.getBlue(pixel)));
}
else if (modelStyle==CS_FLOAT){
return (int)(sourceModel.getRed(pixel)*0.3 sourceModel.getGreen(pixel)*0.59 sourceModel.getBlue(pixel)*0.11);
}
else {
return 0;
}
}
public int getAlpha(int pixel) {
return sourceModel.getAlpha(pixel);
}
public int getRed(int pixel) {
return getGrayLevel(pixel);
}
public int getGreen(int pixel) {
return getGrayLevel(pixel);
}
public int getBlue(int pixel) {
return getGrayLevel(pixel);
}
public int getRGB(int pixel) {
int gray=getGrayLevel(pixel);
return (getAlpha(pixel)24) (gray16) (gray8) gray;
}
}
如果你有自己的算法或者想取得特殊的效果,你可以修改类GrayModel的方法getGrayLevel() 。
色彩变换
根据上面的原理,我们也可以实现色彩变换,这样的效果就很多了 。下面是一个反转变换的例子:
/* ReverseColorModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class ReverseColorModel extends ColorModel {
ColorModel sourceModel;
public ReverseColorModel(ColorModel sourceModel) {
super(sourceModel.getPixelSize());
this.sourceModel=sourceModel;
}
public int getAlpha(int pixel) {
return sourceModel.getAlpha(pixel);
}
public int getRed(int pixel) {
return ~sourceModel.getRed(pixel);
}
public int getGreen(int pixel) {
return ~sourceModel.getGreen(pixel);
}
public int getBlue(int pixel) {
return ~sourceModel.getBlue(pixel);
}
public int getRGB(int pixel) {
return (getAlpha(pixel)24) (getRed(pixel)16) (getGreen(pixel)8) getBlue(pixel);
}
}
/* ReverseColorModel.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.image.*;
public class ReverseFilter extends RGBImageFilter {
public ReverseFilter() {
canFilterIndexColorModel=true;
}
public void setColorModel(ColorModel cm) {
substituteColorModel(cm,new ReverseColorModel(cm));
}
public int filterRGB(int x,int y,int pixel) {
return pixel;
}
}
要想取得自己的效果 , 需要修改ReverseColorModel.java中的三个方法,getRed、getGreen、getBlue 。
下面是上面的效果的一个总的演示程序 。
/*GrayImage.java*/
/*@author:cherami */
/*email:cherami@163.net*/
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.awt.color.*;
public class GrayImage extends JFrame{
Image source,gray,gray3,clip,bigimg;
BufferedImage bimg,gray2;
GrayFilter filter,filter2;
ImageIcon ii;
ImageFilter cropFilter;
int iw,ih;
public GrayImage() {
ii=new ImageIcon(\"images/11.gif\");
source=ii.getImage();
iw=source.getWidth(this);
ih=source.getHeight(this);
filter=new GrayFilter();
filter2=new GrayFilter(GrayModel.CS_FLOAT);
gray=createImage(new FilteredImageSource(source.getSource(),filter));
gray3=createImage(new FilteredImageSource(source.getSource(),filter2));
cropFilter=new CropImageFilter(5,5,iw-5,ih-5);
clip=createImage(new FilteredImageSource(source.getSource(),cropFilter));
bigimg=source.getScaledInstance(iw*2,ih*2,Image.SCALE_DEFAULT);
MediaTracker mt=new MediaTracker(this);
mt.addImage(gray,0);
try {
mt.waitForAll();
} catch (Exception e) {
}
用java编写一个图像处理,光线补偿 、写了很多篇关于图像处理的文章,没有一篇介绍Java 2D的图像处理API,文章讨论和提及的
API都是基于JDK6的,首先来看Java中如何组织一个图像对象BufferedImage的,如图:
一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间 , 类型等
信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首
先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/p
newimageformatIO.jar即可 。
Java中如何读写一个图像文件 , 使用ImageIO对象即可 。读图像文件的代码如下:
File file = new File("D:\\test\\blue_flower.jpg");
BufferedImage image = ImageIO.read(file);
写图像文件的代码如下:
File outputfile = new File("saved.png");
ImageIO.write(bufferedImage, "png",outputfile);
从BufferedImage对象中读取像素数据的代码如下:
1 int type= image.getType();2 if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )3return (int [])image.getRaster().getDataElements(x, y, width, height, pixels );4 else5return image.getRGB( x, y, width, height, pixels, 0, width );
首先获取图像类型,如果不是32位的INT型数据,直接读写RGB值即可,否则需要从Raster
对象中读取 。
往BufferedImage对象中写入像素数据同样遵守上面的规则 。代码如下:
1 int type= image.getType();2 if ( type ==BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )3image.getRaster().setDataElements(x, y, width, height, pixels );4 else5image.setRGB(x, y, width, height, pixels, 0, width );
读取图像可能因为图像文件比较大 , 需要一定时间的等待才可以,Java Advance Image
Processor API提供了MediaTracker对象来跟踪图像的加载,同步其它操作,使用方法如下:
MediaTracker tracker = new MediaTracker(this); //初始化对象 om/roucheng/tracker.addImage(image_01, 1); // 加入要跟踪的BufferedImage对象image_001tracker.waitForID(1, 10000) // 等待10秒 , 让iamge_01图像加载
从一个32位int型数据cARGB中读取图像RGB颜色值的代码如下:
1 int alpha = (cARGB24) 0xff; //透明度通道 g/2 int red = (cARGB16) 0xff;3 int green = (cARGB8) 0xff;4 int blue = cARGB0xff;
将RGB颜色值写入成一个INT型数据cRGB的代码如下:
cRGB = (alpha24) | (red 16) | (green8) | blue;
创建一个BufferedImage对象的代码如下:
BufferedImage image = newBufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
一个完整的源代码Demo如下:
1 package com.gloomyfish.swing;23 import java.awt.BorderLayout;4 import java.awt.Dimension;5 import java.awt.Graphics;6 import java.awt.Graphics2D;7 import java.awt.RenderingHints;8 import java.awt.image.BufferedImage;9 import java.io.File; 10 import java.io.IOException; 1112 import javax.imageio.ImageIO; 13 import javax.swing.JComponent; 14 import javax.swing.JFrame; 1516 public class PlasmaDemo extends JComponent {
1718/**19*
20*/21private static final long serialVersionUID = -2236160343614397287L;
22private BufferedImage image = null;
23private int size = 256; 2425public PlasmaDemo() {
26super();
27this.setOpaque(false);
28}
2930protected void paintComponent(Graphics g) {
31Graphics2D g2 = (Graphics2D)g;
32g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
33g2.drawImage(getImage(), 5, 5, image.getWidth(), image.getHeight(), null);
34}
3536private BufferedImage getImage() {
37if(image == null) {
38image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
39int[] rgbData = https://www.04ip.com/post/new int[size*size];
40generateNoiseImage(rgbData);
41setRGB(image, 0, 0, size, size, rgbData); 42File outFile = new File("plasma.jpg"); 43try { 44ImageIO.write(image, "jpg", outFile); 45} catch (IOException e) { 46e.printStackTrace(); 47} 48}
49return image;
50}
5152public void generateNoiseImage(int[] rgbData) {
53int index = 0;
54int a = 255;
55int r = 0;
56int g = 0;
57int b = 0;
5859for(int row=0; rowsize; row) {
60for(int col=0; colsize; col) {
61// set random color value for each pixel62r = (int)(128.0(128.0 * Math.sin((rowcol) / 8.0)));
63g = (int)(128.0(128.0 * Math.sin((rowcol) / 8.0)));
64b = (int)(128.0(128.0 * Math.sin((rowcol) / 8.0)));
6566rgbData[index] = ((clamp(a)0xff)24) |
67((clamp(r)0xff)16)|
68((clamp(g)0xff)8)|
69((clamp(b)0xff));
70index;
71}
72}
7374}
7576private int clamp(int rgb) {
77if(rgb255)
78return 255;
79if(rgb0)
80return 0;
81return rgb;
82}
8384public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {
85int type = image.getType();
86if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
87image.getRaster().setDataElements( x, y, width, height, pixels );
88else89image.setRGB( x, y, width, height, pixels, 0, width );
90}
9192public static void main(String[] args) {
93JFrame frame = new JFrame("Noise Art Panel");
94frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
95frame.getContentPane().setLayout(new BorderLayout()); m/roucheng/ 98frame.getContentPane().add(new PlasmaDemo(), BorderLayout.CENTER);
99frame.setPreferredSize(new Dimension(40025,450));
100frame.pack();
101frame.setVisible(true);
102}
103 }
关于Java的图像处理代码和java图像处理opencv的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读