图像分析之直方图分析
图像分析之强度直方图分析
直方图介绍
强度直方图图形化显示不同的像素值在不同的强度值上的出现频率,对于灰度图像来说强度
范围为[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);}
}
转载时请注明!
图像分析之直方图分析相关推荐
- 【Python 实战基础】如何绘制直方图分析张三成绩数据
目录 一.实战场景 二.主要知识点 文件读写 基础语法 字符串处理 文件生成 数据构建 三.菜鸟实战 1.创建 python 文件 2.运行结果 一.实战场景 实战场景:如何绘制直方图分析张三成绩数据 ...
- ArcGIS pro/ArcGIS 10.6及以上版本的最强工具箱——“WhiteboxTools”(468新功能:GIS分析,水文分析,图像分析,激光雷达分析,数学和统计分析,数据流网络分析和)!
WhiteboxTools-ArcGIS 用于 WhiteboxTools 的 ArcGIS Python 工具箱. 此存储库与用于 WhiteboxTools的ArcGIS Python Toolb ...
- Photoshop使用直方图分析图像色彩
在Photoshop中,使用"直方图"调板,可以科学直观的观察和分析图像中的色彩,"直方图"以图形的形式显示了图像像素在各个色调区的分布情况,通过显示图像在暗调 ...
- 彩色图像RGB分量直方图分析matlab
彩色和灰度图像直方图 matlab计算图像直方图有自带函数为imhist() 1.直接显示图像i的灰度直方图:imhist( i ) 2.指定灰度级n显示直方图:imhist(i,n) 在彩色图像加密 ...
- 学以致用——利用直方图分析个股涨幅(Excel+Spotfire)
看似简单的一张图,其背后可能是成千上万行的数据在做支撑. 先提个问题,某支股票在过去十年来的月涨幅如何?大部分月份里,该股月涨幅表现怎样?在所有月份里,是涨的多还是跌得多? 有朋友可能会说,这还用问吗 ...
- matlab 直方图_MATLAB作图实例:19:用二元直方图分析图片颜色
本示例说明如何调整二元直方图的颜色标度(color scale),以显示有关分箱(bin)的其他详细信息. 加载图像peppers.png,该图像是几种类型的辣椒和其他蔬菜的彩色照片.无符号的8位整数 ...
- 直方图的计算,绘制与分析
直方图的计算,绘制与分析 目标 • 使用 OpenCV 或 Numpy 函数计算直方图 • 使用 Opencv 或者 Matplotlib 函数绘制直方图 • 将要学习的函数有:cv2.calcHis ...
- LabVIEW图像灰度分析与变换(基础篇—4)
目录 1.图像灰度分析 1.1.直方图分析 1.1.1.灰度图像直方图分析 1.1.2.彩色图像直方图分析 1.2.线灰度曲线分析 1.3.图像线灰度均值分析 1.4.图像形心和质心分析 1.5.图像 ...
- 大数据挖掘与分析平台整体解决方案
大数据挖掘与分析平台 ...
最新文章
- 使用CoreOS及Docker搭建简单的SaaS云平台
- Linux网络相关知识
- UVA 11259 Coin Changing Again
- 2.let和const命令
- Pagodas HDU - 5512
- java word批注_使用反射处理Java批注
- u-boot启动参数命令格式
- Java并发编程实战~Copy-on-Write模式
- Win10系统开机任务栏一直转圈怎么解决
- Java中String.split和StringUtils.split性能比较
- IoT开发精英实战营招募啦!速来报名!
- 开源 - WPF报表引擎
- jQuery焦点图轮播slide插件
- 手机扫描识别Vin码识别
- 无线路由器(WIFI)经常掉线断网的可能的原因
- python报错NameError: name 'NA' is not defined
- box-shadow用法总结
- springboot整合dubbo的问题之一。zookeeper客户端和zookeeper版本不匹配问题
- php codis,codis集群部署实战
- YYCMS搭建影视网站教程
热门文章
- 今天是个天气晴朗的日子
- 模型选择——子集选择法(Subset Selection)
- CAD编辑工具中如何查找图纸中的坐标点的位置
- meta分析 1. Risk Ratio
- DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步
- RooT最好软件,root手机最好的软件
- HDU2037:今年暑假不AC
- matlab2014启动很慢,[转载]matlab启动慢的解决方法
- write字符串python_Python-write()与writelines()和连接字符串
- 树莓派python图形化编程_BlockPi: 树莓派图形化编程软件,轻松控制GPIO、SenseHAT、Picamera等硬件。...