• 图像分析------直方图分析 分类: 视频图像处理 2015-07-24 10:03 33人阅读 评论(0) 收藏


    直方图介绍

    强度直方图图形化显示不同的像素值在不同的强度值上的出现频率,对于灰度图像来说强度

    范围为[0~255]之间,对于RGB的彩色图像可以独立显示三种颜色的强度直方图。强度直方

    图是用来寻找灰度图像二值化阈值常用而且是有效的手段之一,如果一幅灰度图像的直方图

    显示为两个波峰,则二值化阈值应该是这两个波峰之间的某个灰度值。同时强度直方图是调

    整图像对比度的重要依据

     

    直方图实现方法:

    对一幅灰度图像从上到下,从左到右扫描每个像素值,在每个灰度值上计算像素数目,以这

    些数据为基础完成图像直方图的绘制。

    运行效果如下:


    程序实现:

    1.      首先对一幅RGB图像完成灰度转换,转换代码如下:

    2.      初始化直方图数据数组int[256] 因为灰度值的范围为0~255

    3.      扫描灰度图像,完成强度数据计算。

    4.      使用Java 2D绘制直方图

     

    直方图实现源代码:

    1. package com.gloomyfish.image.analysis;  
    2.   
    3. import java.awt.Color;  
    4. import java.awt.Graphics2D;  
    5. import java.awt.image.BufferedImage;  
    6.   
    7. public class HistogramAnalysisAlg {  
    8.     private BufferedImage srcImage;  
    9.     private BufferedImage histogramImage;  
    10.     private int size = 280;  
    11.       
    12.     public HistogramAnalysisAlg(BufferedImage srcImage){  
    13.         histogramImage = new BufferedImage(size,size, BufferedImage.TYPE_4BYTE_ABGR);  
    14.         this.srcImage = srcImage;  
    15.     }  
    16.       
    17.     public BufferedImage getHistogram() {  
    18.         int[] inPixels = new int[srcImage.getWidth()*srcImage.getHeight()];  
    19.         int[] intensity = new int[256];  
    20.         for(int i=0; i<intensity.length; i++) {  
    21.             intensity[i] = 0;  
    22.         }  
    23.         getRGB( srcImage, 00, srcImage.getWidth(), srcImage.getHeight(), inPixels );  
    24.         int index = 0;  
    25.         for(int row=0; row<srcImage.getHeight(); row++) {  
    26.             int ta = 0, tr = 0, tg = 0, tb = 0;  
    27.             for(int col=0; col<srcImage.getWidth(); col++) {  
    28.                 index = row * srcImage.getWidth() + col;  
    29.                 ta = (inPixels[index] >> 24) & 0xff;  
    30.                 tr = (inPixels[index] >> 16) & 0xff;  
    31.                 tg = (inPixels[index] >> 8) & 0xff;  
    32.                 tb = inPixels[index] & 0xff;  
    33.                 int gray = (int)(0.299 * (double)tr + 0.587 * (double)tg + 0.114 * (double)tb);  
    34.                 intensity[gray]++;  
    35.             }  
    36.         }  
    37.           
    38.         // draw XY Axis lines  
    39.         Graphics2D g2d = histogramImage.createGraphics();  
    40.         g2d.setPaint(Color.BLACK);  
    41.         g2d.fillRect(00, size, size);  
    42.         g2d.setPaint(Color.WHITE);  
    43.         g2d.drawLine(5250265250);  
    44.         g2d.drawLine(525055);  
    45.           
    46.         // scale to 200  
    47.         g2d.setPaint(Color.GREEN);  
    48.         int max = findMaxValue(intensity);  
    49.         float rate = 200.0f/((float)max);  
    50.         int offset = 2;  
    51.         for(int i=0; i<intensity.length; i++) {  
    52.             int frequency = (int)(intensity[i] * rate);  
    53.             g2d.drawLine(5 + offset + i, 2505 + offset + i, 250-frequency);  
    54.         }  
    55.           
    56.         // X Axis Gray intensity  
    57.         g2d.setPaint(Color.RED);  
    58.         g2d.drawString("Gray Intensity"100270);  
    59.         return histogramImage;  
    60.     }  
    61.       
    62.     private int findMaxValue(int[] intensity) {  
    63.         int max = -1;  
    64.         for(int i=0; i<intensity.length; i++) {  
    65.             if(max < intensity[i]) {  
    66.                 max = intensity[i];  
    67.             }  
    68.         }  
    69.         return max;  
    70.     }  
    71.   
    72.     /** 
    73.      * A convenience method for getting ARGB pixels from an image. This tries to avoid the performance 
    74.      * penalty of BufferedImage.getRGB unmanaging the image. 
    75.      */  
    76.     public int[] getRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {  
    77.         int type = image.getType();  
    78.         if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )  
    79.             return (int [])image.getRaster().getDataElements( x, y, width, height, pixels );  
    80.         return image.getRGB( x, y, width, height, pixels, 0, width );  
    81.     }  
    82.   
    83.     /** 
    84.      * A convenience method for setting ARGB pixels in an image. This tries to avoid the performance 
    85.      * penalty of BufferedImage.setRGB unmanaging the image. 
    86.      */  
    87.     public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {  
    88.         int type = image.getType();  
    89.         if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )  
    90.             image.getRaster().setDataElements( x, y, width, height, pixels );  
    91.         else  
    92.             image.setRGB( x, y, width, height, pixels, 0, width );  
    93.     }  
    94.   
    95. }  

    测试代码如下:

    1. package com.gloomyfish.image.analysis;  
    2.   
    3. import java.awt.Dimension;  
    4. import java.awt.Graphics;  
    5. import java.awt.Graphics2D;  
    6. import java.awt.MediaTracker;  
    7. import java.awt.image.BufferedImage;  
    8. import java.io.File;  
    9. import java.io.IOException;  
    10.   
    11. import javax.imageio.ImageIO;  
    12. import javax.swing.JComponent;  
    13. import javax.swing.JFileChooser;  
    14. import javax.swing.JFrame;  
    15.   
    16. public class ImageAnalysisUI  extends JComponent {  
    17.     /** 
    18.      *  
    19.      */  
    20.     private static final long serialVersionUID = 1518574788794973574L;  
    21.     private BufferedImage rawImg;  
    22.     private BufferedImage modImg;  
    23.     private MediaTracker tracker;  
    24.     private Dimension mySize;  
    25.       
    26.       
    27.     public ImageAnalysisUI(File f) {  
    28.         try {  
    29.             rawImg = ImageIO.read(f);  
    30.             HistogramAnalysisAlg filter = new HistogramAnalysisAlg(rawImg);  
    31.             modImg = filter.getHistogram();  
    32.         } catch (IOException e1) {  
    33.             e1.printStackTrace();  
    34.         }  
    35.           
    36.         tracker = new MediaTracker(this);  
    37.         tracker.addImage(rawImg, 1);  
    38.           
    39.         // blocked 10 seconds to load the image data  
    40.         try {  
    41.             if (!tracker.waitForID(110000)) {  
    42.                 System.out.println("Load error.");  
    43.                 System.exit(1);  
    44.             }// end if  
    45.         } catch (InterruptedException e) {  
    46.             e.printStackTrace();  
    47.             System.exit(1);  
    48.         }// end catch  
    49.           
    50.         mySize = new Dimension(2*rawImg.getWidth() + 20, rawImg.getHeight()*2);  
    51.         JFrame imageFrame = new JFrame("Gloomyfish - Image Analysis");  
    52.         imageFrame.getContentPane().add(this);  
    53.         imageFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    54.         imageFrame.pack();  
    55.         imageFrame.setVisible(true);  
    56.     }  
    57.       
    58.     public void paint(Graphics g) {  
    59.         Graphics2D g2 = (Graphics2D) g;  
    60.         g2.drawImage(rawImg, 00, rawImg.getWidth(), rawImg.getHeight(), null);  
    61.         g2.drawImage(modImg, rawImg.getWidth()+100, modImg.getWidth(), modImg.getHeight(), null);  
    62.         g2.drawString("source image"10, rawImg.getHeight() +10);  
    63.         g2.drawString("connected component labeled area"10 + modImg.getWidth(), rawImg.getHeight() +10);  
    64.     }  
    65.     public Dimension getPreferredSize() {  
    66.         return mySize;  
    67.     }  
    68.       
    69.     public Dimension getMinimumSize() {  
    70.         return mySize;  
    71.     }  
    72.       
    73.     public Dimension getMaximumSize() {  
    74.         return mySize;  
    75.     }  
    76.       
    77.     public static void main(String[] args) {  
    78.         JFileChooser chooser = new JFileChooser();  
    79.         chooser.showOpenDialog(null);  
    80.         File f = chooser.getSelectedFile();  
    81.         new ImageAnalysisUI(f);  
    82.     }  
    83. }  
    转载时请注明!

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Python 中lambda 简单介绍
    关于python中带下划线的变量和函数 的意义
    Python 类的方法,下划线有什么不同?
    Python中用format函数格式化字符串的用法(2.7版本讲解哦!)
    如何理解 Python 中的__init__
    Python引用多个模块,调用模块中的函数时,要注意的地方
    Python tips: 什么是*args和**kwargs?
    如何简单地理解Python中的if __name__ == '__main__'
    NLP点滴——文本相似度
    马里奥AI实现方式探索 ——神经网络+增强学习
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706363.html
Copyright © 2020-2023  润新知