资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

java图像处理代码 java绘制图片代码

java代码怎么实现计算图像二值连通区域的质心

一:几何距(Geometric

创新互联公司服务项目包括克州网站建设、克州网站制作、克州网页制作以及克州网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,克州网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到克州省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

Moments)知识与质心寻找原理

1.

Image

Moments是图像处理中非常有用的算法,可以用来计算区域图像的质心,方向等几何特性,同时Mpq的高阶具有旋转不变性,可以用来实现图像比较分类,正是因为Moments有这些特性,很多手绘油画效果也会基于该算法来模拟实现。它的数学表达为:

它的低阶M00,M01,

M10可以用来计算质心,中心化以后M11,M02,M20可以用来计算区域的方向/角度

2.

什么是质心

就是通过该点,区域达到一种质量上的平衡状态,可能物理学上讲的比较多,简单点的说就是规则几何物体的中心,不规则的可以通过挂绳子的方法来寻找。

二:算法流程

1.

输入图像转换为二值图像

2.

通过连通组件标记算法找到所有的连通区域,并分别标记

3.

对每个连通区域运用计算几何距算法得到质心

4.

用不同颜色绘制连通区域与质心,输出处理后图像

三:算法效果

左边为原图,

右边蓝色为连通组件标记算法处理以后结果,白色点为质心

四:关键代码解析

1.

计算几何距算法代码

doublem00

=

moments(pixels,

width,

height,

0,

0);

doublexCr

=

moments(pixels,

width,

height,

1,

0)

/

m00;//

row

doubleyCr

=

moments(pixels,

width,

height,

0,

1)

/

m00;//

column

return

new

double[]{xCr,

yCr};

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数字图像处理》pdf下载在线阅读全文,求百度网盘云资源

《JAVA数字图像处理》百度网盘pdf最新全集下载:

链接:

?pwd=f8sq 提取码: f8sq

简介:在开始本书内容之前,笔者假设你已经有了面向对象语言编程的基本概念,了解Java语言的基本语法与特征,原因在于本书的所有源代码都是基于Java语言实现的,而且是基于Java开发环境运行与演示所有图像处理算法的。本书第1章到第3章是为了帮助读者了解与掌握Java图形与GUI编程的基本知识与概念而写的。本章主要介绍Java GUI编程中基本的图形知识,针对GU1编程,Java语言提供了两套几乎并行的API,分别是Swing与AWT。早期的Java GUJ编程中主要使用AWT的相关组件,但是AWT的功能并不是十分强大,而且严重依赖本地接口。于是在Java 1.3及后续版本中引入了Swing工具实现GUl编程,Swing中的组件大多数都是基于纯Java语言实现的,而不是通过本地组件实现的,所以它们是轻量级的GUI组件,同时Swing对图形与图像的支持操作也有很大的提高与增强。如何区分AWT组件与Swing组件?一个简单而且相当直观的方法是看Class的名称,Swing的组件大多数带有大写的前缀字母J。  

关于JAVA的图片处理问题

public static boolean write(RenderedImage im, String formatName, File output) throws IOException

使用支持给定格式的任意 ImageWriter 将一个图像写入 File。如果已经有一个 File 存在,则丢弃其内容。

参数:im - 要写入的 RenderedImage。

formatName - 包含格式非正式名称的 String。

output - 将在其中写入数据的 File。

返回:如果没有找到合适的 writer,则返回 false。

抛出: IllegalArgumentException - 如果任何参数为 null。

IOException - 如果在写入过程中发生错误。

说白了,就是按指定的formatName把图片存到file(或OutputStream)中。formatName是已注册的、可以保存图片的writer的非正式名称,比如“jpeg”,“tiff”。如果想知道到底有哪些writer在你的机器上被注册了,用ImageIO.getWriterFormatNames(),返回类型是String[] 。同样的,还有读取图片的reader,对应的是ImageIO.getReaderFormatNames()。

最后要说的是,这个方法是保存图片,和上传没有关系。你可能是要上传图片后再保存吧!

新手学习使用Java,尝试着做一个项目使用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;

}

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绘制图片代码
分享网址:http://cdkjz.cn/article/hgjdjs.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220