• 技术文章 >Java >java教程

    java 加载图像,显示图像和图像的灰度化

    黄舟黄舟2016-12-30 11:58:35原创897
    用java基础包中,提供了图像的类,我们常用到的有java.awt.image.BufferedImage,javax.imageio.ImageIO等等,事实上这两个类就够了。前一个有关图像的基本操作,后一个为读取图像。

    加载图像:

          BufferedImage img = null;  
            try{  
                img = ImageIO.read(new FileInputStream("/home/eple/DIP/o.jpg"));  
              
            }catch (IOException e) {  
                //e.printStackTrace();  
            }

    我是在ubuntu下运行的,所以文件路径和windows的略微不同。

    为了使代码更通用,我自己新建了一个图像处理的类Imgae。

    public class Image{
    	
    	public int h; //高
    	public int w; //宽
    	public int[] data; //像素
    	public boolean gray; //是否为灰度图像
    	
    	public Image(BufferedImage img){
    		
    		this.h = img.getHeight();
    		this.w = img.getWidth();
    		
    		this.data = img.getRGB(0, 0, w, h, null, 0, w);
    		this.gray = false;
    		toGray(); //灰度化
    	}
    	
    	public Image(BufferedImage img,int gray){
    		
    		this.h = img.getHeight();
    		this.w = img.getWidth();
    		this.data = img.getRGB(0, 0, w, h, null, 0, w);
    		this.gray = false;
    
    	}
    
    	public Image(int[] data,int h,int w){
    		this.data = (data == null) ? new int[w*h]:data;
    		this.h = h;
    		this.w = w;
    		this.gray = false;
    	}
    	
    	public Image(int h,int w){
    		this(null,h,w);
    	}
    
            public BufferedImage toImage(){
                   BufferedImage image = new BufferedImage(this.w, this.h, BufferedImage.TYPE_INT_ARGB);
                   int[] d= new int[w*h];
                   for(int i=0;i<this.h;i++){
                   for(int j=0;j<this.w;j++){
                       if(this.gray){
                           d[j+i*this.w] = (255<<24)|(data[j+i*this.w]<<16)|(data[j+i*this.w]<<8)|(data[j+i*this.w]);
                       }else{
                           d[j+i*this.w] = data[j+i*this.w];
                       }
                   }
             }
                image.setRGB( 0, 0, w, h, d, 0, w ); 
                return image;
         }
    
    }

    这样可以不依赖java自身提供的方法,我们只需要把图像转成我们所定义的类即可。比如在android中,像素的读取和生存如下,只要将相关函数替换即可。

     //android 中的获取方式RGB分量    
       pixelsA = Color.alpha(color);    
       pixelsR = Color.red(color);    
       pixelsG = Color.green(color);    
       pixelsB = Color.blue(color);  
                          
     // 根据新的RGB生成新像素    
       newPixels[i] = Color.argb(pixelsA, pixelsR, pixelsG, pixelsB);


    好了,上面的类就包含了读取图像像素信息保存为int数组和将int数组重新转化为Bufferedmage的方法。下面我们就讲讲如何对图像去色,即灰度化。

    上一篇我们说到过,对图像处理的事实,我们更关心图像的亮度信息,也就是灰度,如何将彩色图像转换成灰度图像呢?很简单,只要令R,G,B三个值相等即可。那么这个值和原R,G,B的值是什么关系呢?

    一般的,我们有经验公式 Gray=R×0.299+G×0.587+B×0.114,或者直接取它们的均值即可。前面的经验公式更符合人眼的观测。灰度化函数如下:

    public void toGray(){  
              
            if(!gray){  
                this.gray = true;  
                for (int y = 0; y < h; y++) {  
                           for (int x = 0; x < w; x++) {  
                              int c = this.data[x + y * w];  
                              int R = (c >> 16) & 0xFF;  
                              int G = (c >> 8) & 0xFF;  
                              int B = (c >> 0) & 0xFF;  
                              this.data[x + y * w] = (int)(0.3f*R + 0.59f*G + 0.11f*B); //to gray  
                    }  
                  }  
            }  
        }

    处理效果如下:

    730.jpg

    731.jpg

    以上就是java 加载图像,显示图像和图像的灰度化的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:java 图像灰度直方图 下一篇:新Java运动:测试驱动开发3---用户注册
    php培训_php实战培训【立即报名】-php中文网第20期

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 完全掌握Java中的抽象类和接口• Java中的set集合如何理解• 详细了解java多线程机制• Java中的Object类知识点归纳• 一文掌握JAVA 面向对象之多态
    1/1

    PHP中文网