图像分析------直方图分析

直方图介绍

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

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

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

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

整图像对比度的重要依据

 

直方图实现方法:

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

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

运行效果如下:

程序实现:

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

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

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

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

 

直方图实现源代码:

[java] view plaincopy

  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, 0, 0, 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(0, 0, size, size);  
  42.         g2d.setPaint(Color.WHITE);  
  43.         g2d.drawLine(5, 250, 265, 250);  
  44.         g2d.drawLine(5, 250, 5, 5);  
  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, 250, 5 + offset + i, 250-frequency);  
  54.         }  
  55.           
  56.         // X Axis Gray intensity  
  57.         g2d.setPaint(Color.RED);  
  58.         g2d.drawString("Gray Intensity", 100, 270);  
  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. }  

测试代码如下:

[java] view plaincopy

  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(1, 10000)) {  
  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, 0, 0, rawImg.getWidth(), rawImg.getHeight(), null);  
  61.         g2.drawImage(modImg, rawImg.getWidth()+10, 0, 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. }  

转载时请注明!

时间: 2024-08-03 21:26:58

图像分析------直方图分析的相关文章

Oracle直方图

Oracle直方图 直方图是一种按数据出现的频率来进行分类存储的方法.在oracle中直方图是用来描述表中列数据的分布情况.每一个sql在被执行前都要经过优化这一步骤那么在优化器给出一个最优执行计划之优化器应该要知道sql语句中所引用的底层对象的详细信息. 直方图描述的对象包括列中不同值的数量和它们出现的频率.现在存储每一个不同值和它出现的频率是不可行的,特别是对于大表来说列中有上万个不同值,oracle使用直方图来存储关于列中数据分布的有用信息而且oracle的CBO使用直方图信息来计算出一个

oracle的DBMS_STATS包知识详解

DBMS_STAS包不仅能够对表进行分析,它还可以对数据库分析进行管理. 按照功能可以分一下几类: (1)       性能数据的收集 (2)       性能数据的设置 (3)       性能数据的删除 (4)       性能数据的备份和恢 更多信息参考Oracle 联机文档: 11g DBMS_STATS http://download.oracle.com/docs/cd/E11882_01/appdev.112/e10577/d_stats.htm#ARPLS68486 10g DB

通过后期PS伪日系

  这两年日系在大陆很热门,说实话我自己也很喜欢日系,所以花了很多时间去琢磨这个风格,说一说我对日系的理解. 一.什么是日系风格 大家所喜欢的一种最广泛流传的日系,是心境的表达,氛围的传递. 日系风格从画风来说应该是情感透彻.细腻,从感觉上来说应该是安静.单纯,看完日系的相片,最直观的感受应该是时而流动,时而凝固,阳光的片子会很暖,稍阴一些的片子会像水一样透彻. 二.创作日系摄影时候的误区 这里首先说明一下,观点只是我自己的理解,并不一定正确.误区总结大致如下: 1.形式大于内容 图片来源于网络

图像处理------调整亮度与对比度

很多时候,一张图像被过度曝光显得很白,或者光线不足显得很暗,有时候背景跟图像人物 也观察不清楚,这个时候可以通过调节图像的两个基本属性-亮度与对比度来获得整体效果 的提升,从而得到质量更高的图片.   基本原理: 图像亮度本质上图像中每个像素的亮度,每个像素的亮度本质上RGB值的大小,RGB值为0 是像素点为黑色,RGB都为255时像素点最亮,为白色.对比度则是不同像素点之间的差值, 差值越大,对比度越明显.从直方图分析的观点来看,对比度越好的图片,直方图曲线会越 明显,分布也越显得均匀.  

oracle 的动态采样技术

Oracle 数据库中优化器(Optimizer)是SQL分析和执行的优化工具,它负责指定SQL的执行计划,也就是它负责保证SQL执行的效率最高,比如优化器决定Oracle 以什么样的方式来访问数据,是全表扫描(Full Table Scan),索引范围扫描(Index Range Scan)还是全索引快速扫描(INDEX Fast Full Scan:INDEX_FFS);对于表关联查询,它负责确定表之间以一种什么方式来关联,比如HASH_JOHN还是NESTED LOOPS 或者MERGE

R语言数据挖掘

数据分析与决策技术丛书 R语言数据挖掘 Learning Data Mining with R [哈萨克斯坦]贝特·麦克哈贝尔(Bater Makhabel) 著 李洪成 许金炜 段力辉 译 图书在版编目(CIP)数据 R语言数据挖掘 / (哈)贝特·麦克哈贝尔(Bater Makhabel)著:李洪成,许金炜,段力辉译. -北京:机械工业出版社,2016.9 (数据分析与决策技术丛书) 书名原文:Learning Data Mining with R ISBN 978-7-111-54769-

从相似度算法谈起 - Effective similarity search in PostgreSQL

标签 PostgreSQL , 数组 , 相似度 , 文本分析 , 图像分析 , 字符串分析 , 婚姻介绍 , 精确配对 背景 相似度分析是一个非常普遍的需求,例如根据用户提供的线索,从一堆文本数据.图片数据.视频数据中筛选一段与用户的描述相近的. 我之前写过一系列的文章来介绍,文本.图片相似度搜索的技术和使用场景. <PostgreSQL 在视频.图片去重,图像搜索业务中的应用> <弱水三千,只取一瓢,当图像搜索遇见PostgreSQL(Haar wavelet)> <聊一

成就世界上首个数码单反相机的图像传感器

今年夏初,我们的KAF-1300图像传感器入榜美国电气和电子工程师协会的旗舰杂志和网站IEEE Spectrum的首届芯片名人堂.芯片名人堂旨在讲述历史上最好和最有影响力的微芯片(及创建它们的人)的故事.1991年图像传感器成就了世界上首个数码单反(DSLR)相机,KAF-1300当然入选. 虽然具有数百万像素的相机在今天已是平常,但在20世纪90年代初,100万像素是个"不可思议的数字",令数码相机用于当时全胶卷的世界.KAF 1300 –由柯达图像传感器部(现是安森美半导体的一部分

《R语言数据挖掘》----1.14 数据变换与离散化

本节书摘来自华章出版社<R语言数据挖掘>一书中的第1章,第1.14节,作者[哈萨克斯坦]贝特·麦克哈贝尔(Bater Makhabel),李洪成 许金炜 段力辉 译,更多章节内容可以访问"华章计算机"公众号查看. 1.14 数据变换与离散化 根据前面的内容,我们可以知道总有一些数据格式最适合特定的数据挖掘算法.数据变换是一种将原始数据变换成较好数据格式的方法,以便作为数据处理前特定数据挖掘算法的输入. 1.14.1 数据变换 数据变换程序将数据变换成可用于挖掘的恰当形式.它