图像分析之强度直方图分析

直方图介绍

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

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

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

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

整图像对比度的重要依据

直方图实现方法:

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

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

运行效果如下:

程序实现:

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

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

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

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

直方图实现源代码:

package com.gloomyfish.image.analysis;import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;public class HistogramAnalysisAlg {private BufferedImage srcImage;private BufferedImage histogramImage;private int size = 280;public HistogramAnalysisAlg(BufferedImage srcImage){histogramImage = new BufferedImage(size,size, BufferedImage.TYPE_4BYTE_ABGR);this.srcImage = srcImage;}public BufferedImage getHistogram() {int[] inPixels = new int[srcImage.getWidth()*srcImage.getHeight()];int[] intensity = new int[256];for(int i=0; i<intensity.length; i++) {intensity[i] = 0;}getRGB( srcImage, 0, 0, srcImage.getWidth(), srcImage.getHeight(), inPixels );int index = 0;for(int row=0; row<srcImage.getHeight(); row++) {int ta = 0, tr = 0, tg = 0, tb = 0;for(int col=0; col<srcImage.getWidth(); col++) {index = row * srcImage.getWidth() + col;ta = (inPixels[index] >> 24) & 0xff;tr = (inPixels[index] >> 16) & 0xff;tg = (inPixels[index] >> 8) & 0xff;tb = inPixels[index] & 0xff;int gray = (int)(0.299 * (double)tr + 0.587 * (double)tg + 0.114 * (double)tb);intensity[gray]++;}}// draw XY Axis linesGraphics2D g2d = histogramImage.createGraphics();g2d.setPaint(Color.BLACK);g2d.fillRect(0, 0, size, size);g2d.setPaint(Color.WHITE);g2d.drawLine(5, 250, 265, 250);g2d.drawLine(5, 250, 5, 5);// scale to 200g2d.setPaint(Color.GREEN);int max = findMaxValue(intensity);float rate = 200.0f/((float)max);int offset = 2;for(int i=0; i<intensity.length; i++) {int frequency = (int)(intensity[i] * rate);g2d.drawLine(5 + offset + i, 250, 5 + offset + i, 250-frequency);}// X Axis Gray intensityg2d.setPaint(Color.RED);g2d.drawString("Gray Intensity", 100, 270);return histogramImage;}private int findMaxValue(int[] intensity) {int max = -1;for(int i=0; i<intensity.length; i++) {if(max < intensity[i]) {max = intensity[i];}}return max;}/*** A convenience method for getting ARGB pixels from an image. This tries to avoid the performance* penalty of BufferedImage.getRGB unmanaging the image.*/public int[] getRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {int type = image.getType();if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )return (int [])image.getRaster().getDataElements( x, y, width, height, pixels );return image.getRGB( x, y, width, height, pixels, 0, width );}/*** A convenience method for setting ARGB pixels in an image. This tries to avoid the performance* penalty of BufferedImage.setRGB unmanaging the image.*/public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {int type = image.getType();if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )image.getRaster().setDataElements( x, y, width, height, pixels );elseimage.setRGB( x, y, width, height, pixels, 0, width );}}

测试代码如下:

package com.gloomyfish.image.analysis;import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MediaTracker;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;public class ImageAnalysisUI  extends JComponent {/*** */private static final long serialVersionUID = 1518574788794973574L;private BufferedImage rawImg;private BufferedImage modImg;private MediaTracker tracker;private Dimension mySize;public ImageAnalysisUI(File f) {try {rawImg = ImageIO.read(f);HistogramAnalysisAlg filter = new HistogramAnalysisAlg(rawImg);modImg = filter.getHistogram();} catch (IOException e1) {e1.printStackTrace();}tracker = new MediaTracker(this);tracker.addImage(rawImg, 1);// blocked 10 seconds to load the image datatry {if (!tracker.waitForID(1, 10000)) {System.out.println("Load error.");System.exit(1);}// end if} catch (InterruptedException e) {e.printStackTrace();System.exit(1);}// end catchmySize = new Dimension(2*rawImg.getWidth() + 20, rawImg.getHeight()*2);JFrame imageFrame = new JFrame("Gloomyfish - Image Analysis");imageFrame.getContentPane().add(this);imageFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);imageFrame.pack();imageFrame.setVisible(true);}public void paint(Graphics g) {Graphics2D g2 = (Graphics2D) g;g2.drawImage(rawImg, 0, 0, rawImg.getWidth(), rawImg.getHeight(), null);g2.drawImage(modImg, rawImg.getWidth()+10, 0, modImg.getWidth(), modImg.getHeight(), null);g2.drawString("source image", 10, rawImg.getHeight() +10);g2.drawString("connected component labeled area", 10 + modImg.getWidth(), rawImg.getHeight() +10);}public Dimension getPreferredSize() {return mySize;}public Dimension getMinimumSize() {return mySize;}public Dimension getMaximumSize() {return mySize;}public static void main(String[] args) {JFileChooser chooser = new JFileChooser();chooser.showOpenDialog(null);File f = chooser.getSelectedFile();new ImageAnalysisUI(f);}
}

转载时请注明!

图像分析之直方图分析相关推荐

  1. 【Python 实战基础】如何绘制直方图分析张三成绩数据

    目录 一.实战场景 二.主要知识点 文件读写 基础语法 字符串处理 文件生成 数据构建 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景:如何绘制直方图分析张三成绩数据 ...

  2. ArcGIS pro/ArcGIS 10.6及以上版本的最强工具箱——“WhiteboxTools”(468新功能:GIS分析,水文分析,图像分析,激光雷达分析,数学和统计分析,数据流网络分析和)!

    WhiteboxTools-ArcGIS 用于 WhiteboxTools 的 ArcGIS Python 工具箱. 此存储库与用于 WhiteboxTools的ArcGIS Python Toolb ...

  3. Photoshop使用直方图分析图像色彩

    在Photoshop中,使用"直方图"调板,可以科学直观的观察和分析图像中的色彩,"直方图"以图形的形式显示了图像像素在各个色调区的分布情况,通过显示图像在暗调 ...

  4. 彩色图像RGB分量直方图分析matlab

    彩色和灰度图像直方图 matlab计算图像直方图有自带函数为imhist() 1.直接显示图像i的灰度直方图:imhist( i ) 2.指定灰度级n显示直方图:imhist(i,n) 在彩色图像加密 ...

  5. 学以致用——利用直方图分析个股涨幅(Excel+Spotfire)

    看似简单的一张图,其背后可能是成千上万行的数据在做支撑. 先提个问题,某支股票在过去十年来的月涨幅如何?大部分月份里,该股月涨幅表现怎样?在所有月份里,是涨的多还是跌得多? 有朋友可能会说,这还用问吗 ...

  6. matlab 直方图_MATLAB作图实例:19:用二元直方图分析图片颜色

    本示例说明如何调整二元直方图的颜色标度(color scale),以显示有关分箱(bin)的其他详细信息. 加载图像peppers.png,该图像是几种类型的辣椒和其他蔬菜的彩色照片.无符号的8位整数 ...

  7. 直方图的计算,绘制与分析

    直方图的计算,绘制与分析 目标 • 使用 OpenCV 或 Numpy 函数计算直方图 • 使用 Opencv 或者 Matplotlib 函数绘制直方图 • 将要学习的函数有:cv2.calcHis ...

  8. LabVIEW图像灰度分析与变换(基础篇—4)

    目录 1.图像灰度分析 1.1.直方图分析 1.1.1.灰度图像直方图分析 1.1.2.彩色图像直方图分析 1.2.线灰度曲线分析 1.3.图像线灰度均值分析 1.4.图像形心和质心分析 1.5.图像 ...

  9. 大数据挖掘与分析平台整体解决方案

                                              大数据挖掘与分析平台                                                 ...

最新文章

  1. 使用CoreOS及Docker搭建简单的SaaS云平台
  2. Linux网络相关知识
  3. UVA 11259 Coin Changing Again
  4. 2.let和const命令
  5. Pagodas HDU - 5512
  6. java word批注_使用反射处理Java批注
  7. u-boot启动参数命令格式
  8. Java并发编程实战~Copy-on-Write模式
  9. Win10系统开机任务栏一直转圈怎么解决
  10. Java中String.split和StringUtils.split性能比较
  11. IoT开发精英实战营招募啦!速来报名!
  12. 开源 - WPF报表引擎
  13. jQuery焦点图轮播slide插件
  14. 手机扫描识别Vin码识别
  15. 无线路由器(WIFI)经常掉线断网的可能的原因
  16. python报错NameError: name 'NA' is not defined
  17. box-shadow用法总结
  18. springboot整合dubbo的问题之一。zookeeper客户端和zookeeper版本不匹配问题
  19. php codis,codis集群部署实战
  20. YYCMS搭建影视网站教程

热门文章

  1. 今天是个天气晴朗的日子
  2. 模型选择——子集选择法(Subset Selection)
  3. CAD编辑工具中如何查找图纸中的坐标点的位置
  4. meta分析 1. Risk Ratio
  5. DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步
  6. RooT最好软件,root手机最好的软件
  7. HDU2037:今年暑假不AC
  8. matlab2014启动很慢,[转载]matlab启动慢的解决方法
  9. write字符串python_Python-write()与writelines()和连接字符串
  10. 树莓派python图形化编程_BlockPi: 树莓派图形化编程软件,轻松控制GPIO、SenseHAT、Picamera等硬件。...