灰度图像直方图统计

合集下载

图像处理6灰度直方图和直方图均衡化

图像处理6灰度直方图和直方图均衡化

图像处理6灰度直⽅图和直⽅图均衡化灰度直⽅图介绍灰度直⽅图(Gray histogram)是关于灰度级分布的函数,是对图像中灰度级分布的统计。

灰度直⽅图是将数字图像中的所有像素,按照灰度值的⼤⼩,统计其出现的频率。

灰度直⽅图是灰度级的函数,它表⽰图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。

如果将图像总像素亮度(灰度级别)看成是⼀个随机变量,则其分布情况就反映了图像的统计特性,这可⽤probability density function (PDF)来刻画和描述,表现为灰度直⽅图。

实现以下代码便于理解灰度直⽅图的计算,其中histogram函数是基于numpy简化的,运⾏结果如下。

# coding: utf8from skimage import dataimport matplotlib.pyplot as pltimport numpy as npdef histogram(a, bins=10, range=None):"""Compute the histogram of a set of data."""import numpy as npfrom numpy.core import linspacefrom numpy.core.numeric import (arange, asarray)# 转成⼀维数组a = asarray(a)a = a.ravel()mn, mx = [mi + 0.0 for mi in range]ntype = np.dtype(np.intp)n = np.zeros(bins, ntype)# 预计算直⽅图缩放因⼦norm = bins / (mx - mn)# 均分,计算边缘以进⾏潜在的校正bin_edges = linspace(mn, mx, bins + 1, endpoint=True)# 分块对于⼤数组可以降低运⾏内存,同时提⾼速度BLOCK = 65536for i in arange(0, len(a), BLOCK):tmp_a = a[i:i + BLOCK]tmp_a_data = tmp_a.astype(float)# 减去Range下限,乘以缩放因⼦,向下取整tmp_a = tmp_a_data - mntmp_a *= normindices = tmp_a.astype(np.intp)# 对indices标签分别计数,标签等于bins减⼀indices[indices == bins] -= 1n += np.bincount(indices, weights=None,minlength=bins).astype(ntype)return n, bin_edgesif__name__ =="__main__":img=data.coffee()fig = plt.figure()f1 = fig.add_subplot(141)f1.imshow(img)f1.set_title("image")f2 = fig.add_subplot(142)arr=img.flatten()n, bins, patches = f2.hist(arr, bins=256, facecolor='red')f2.set_title("plt_hist")f3 = fig.add_subplot(143)hist, others = np.histogram(arr, range=(0, arr.max()), bins=256)f3.plot(others[1:],hist)f3.set_title("np_hist1")f4 = fig.add_subplot(144)hist, others = histogram(arr, range=(0, arr.max()), bins=256)f4.plot(others[1:], hist)f4.set_title("np_hist2")plt.show()关于bincount函数,可以参考Xurtle的博⽂https:///xlinsist/article/details/51346523bin的数量⽐x中的最⼤值⼤1,每个bin给出了它的索引值在x中出现的次数。

用MATLAB统计图像直方图

用MATLAB统计图像直方图
1、单下标:
提示:从1 开始,不 是从0开始!
有用的命令和函数
3、矩阵元素索引
2、双下标:
有用的命令和函数
循环控制: for 语法:for 控制条件
执行语句; end
找出5阶魔方矩阵中的25的坐标。 a=magic(5); m=0; n=0; for i=1:5 for j=1:5 if a(i,j)==25 m=i; n=j; end end end
字母 颜色
y 黄色 m 粉红 c 亮蓝 r 大红 g 绿色 b 蓝色 w 白色 k 黑色
标点 线型
· 点线
○ 圈线
× ×线
+ +字线
- 实线
*
星形线
: 虚线
-·(--) 点划线
bar(x,y)
while 使用while语句,找出最小的n,使得 n!<10e100
n = 1; while prod(1:n) < 1e100
n = n+1 end fprintf('%g! = %e > 1e100\n', n, prod(1:n)); 70! = 1.197857e+100 > 1e100
绘图:plot(x,y) x = -pi:pi/10:pi; y = tan(sin(x)) - sin(tan(x)); plot(x,y,'--rs','LineWidth',2,...
'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',10)
基本概念

图像直方图均衡化原理

图像直方图均衡化原理

图像直方图均衡化原理
图像直方图均衡化是一种常用的图像增强方法,通过调整图像的像素灰度分布,使得图像的对比度增强、细节更加清晰。

其原理主要分为以下几个步骤:
1. 统计像素灰度值的分布:首先,对待处理的图像,统计每个灰度级别的像素点数量,得到原始图像的灰度直方图。

2. 计算累计分布函数:根据灰度直方图,计算每个灰度级别对应的累计分布函数,即该灰度级别及其之前的像素点的累积数量比例。

3. 灰度映射:对于每个像素点,将其灰度值通过累计分布函数进行映射,得到新的灰度值。

通常情况下,可以通过线性映射或非线性映射来实现,使得图像的灰度分布变得更加均匀。

4. 重构图像:将经过灰度映射处理后的灰度值替换原始图像中的对应像素点的灰度值,从而得到均衡化后的图像。

通过图像直方图均衡化处理,可以提高图像的对比度,使暗部和亮部细节更加突出,同时抑制了图像中灰度级别分布不均匀的问题。

这种方法在图像增强、图像分析等领域都有广泛应用。

matlab中统计特定灰度值的个数

matlab中统计特定灰度值的个数

一、概述在图像处理和计算机视觉领域,统计特定灰度值的个数是非常重要的一项工作。

而在使用Matlab进行图像处理时,统计特定灰度值的个数也是一种常见的操作。

本文将从Matlab中统计特定灰度值的个数的方法进行详细介绍。

二、Matlab中统计特定灰度值的个数的函数在Matlab中,可以使用imhist函数来统计图像中特定灰度值的个数。

imhist函数可以统计图像中各个灰度级别的像素数量,并绘制直方图。

其语法如下:counts = imhist(I, nbins)其中,I表示输入的图像,nbins表示要统计的灰度级别的数量。

imhist函数将返回一个长度为nbins的向量counts,counts(i)表示灰度级别i的像素数量。

三、实例演示为了更好地理解imhist函数的使用方法,接下来将以一幅示例图像为例进行演示。

```matlab读取示例图像I = imread('example.png');统计灰度值为128的像素数量counts = imhist(I, 256);显示直方图bar(counts);```上述示例中,首先使用imread函数读取示例图像example.png,然后使用imhist函数统计灰度值为128的像素数量,并将结果保存在counts变量中。

最后使用bar函数绘制counts的直方图,从而可视化灰度值为128的像素数量。

四、使用imhist函数统计特定灰度值的个数的注意事项在使用imhist函数统计特定灰度值的个数时,需要注意以下几点:1. 确保输入的图像是灰度图像或者将彩色图像转换成灰度图像。

2. 灰度级别的数量nbins一般取256,表示统计全部灰度级别的像素数量。

3. 如果只需统计特定灰度值的个数,可以通过调整nbins的取值来实现。

五、总结通过本文的介绍,相信读者已经了解了在Matlab中使用imhist函数来统计特定灰度值的个数的方法。

在图像处理和计算机视觉领域,掌握这一技巧对于解决实际问题非常有帮助。

bmp图像直方图统计

bmp图像直方图统计

实验名称: BMP 图 像 直 方 图 统 计(一) 实验目的1.熟悉BMP 图像格式2.学习直方图统计方法(二) 基本原理直方图的计算:设图像中某种灰度f i 的像素数为n j ,n 是图像中像素的总数,则灰度级f j 所对应的频数为:(1)初始化:建立一个数组,具有l (如,256)个元素,每个元素初值为0: unsigned long a[256] //保存某灰度级的像素数for (i=0,i<256,i++) a[i]=0;(2)统计:从图像中逐点读取灰度值f(x,y),若f(x,y)=k,令a[k]=a[k]+1;(3)标准化:b[k]=(float)a[k]/像素总数;(4)画出直方图。

流程图如下(三) 实验步骤void CDigiPicDoc::OnDistillHist( ){// TODO: Add your command handler code herelong i,j;//获取图像关键数据long nWidth=m_pDib->GetWidth();long nwidthOnLine = m_pDib->GetDibWidthBytes();long nHeight=m_pDib->GetHeight();BYTE *pData=m_pDib->m_pData;RGBQUAD *pRGBQuad=m_pDib->m_pRGB;//判断图像是否8位图像n n f P j j f =)(1,,2,1,0-=l jif(m_pDib->m_pBitmapInfoHeader->biBitCount!=8){AfxMessageBox("请打开8位位图");return;}//申请存放直方图数据的数组double *hist=0;hist = new double[256];//记得要释放for(i=0;i<256;i++) {hist[i] = 0.0;}//统计直方图数据,即各种灰度出现的次数for(i=0;i<nHeight;i++){for(j=0;j<nWidth;j++){BYTE datatmp = pData[i*nwidthOnLine+j];hist[datatmp]++;}}//将直方图写入文件CString filepath,strTmp;filepath="D:\\hist.txt";CStdioFile file(filepath,CFile::modeCreate|CFile::modeWrite); for(i=0;i<256;i++) {strTmp.Format("%d",i);file.WriteString(strTmp+":\t");strTmp.Format("%lf",hist[i]);file.WriteString(strTmp+"\n");}file.Close();//删除动态申请的空间delete hist;hist = 0;AfxMessageBox("直方图统计完毕!");}(四) 实验结果(五) 实验总结通过这次的实验,使我对Matlab图像处理工具有了较深的了解,对课堂上学习到的理论知识有了明确的认识、知道其在实际中的应用,对于以后的学习和工作都会有很大的帮助。

计算图像的基本统计指标Read课件

计算图像的基本统计指标Read课件
灰度中值可以反映图像的亮度分布情况,对于二值化图像, 中值的大小决定了二值化的阈值。
灰度熵
总结词
灰度熵是一种衡量图像信息复杂度的指标,表示图像中像素灰度级分布的不确定 性或随机性。
详细描述
灰度熵计算公式为-sum(p(i)*log2(p(i))),其中p(i)表示灰度值为i的像素出现的概 率。较大的熵值意味着图像具有较高的信息量。
PART 03
图像的结构特性
边缘检测
边缘检测是图像处理中的基本操 作,用于识别图像中的边缘和轮
廓。
边缘检测算法通过分析图像中的 像素强度变化来检测边缘,通常 使用一阶或二阶导数来检测边缘

常见的边缘检测算法包括Sobel 、Prewitt、Canny等。
角点检测
01
角点检测是图像处理中 的一项重要任务,用于 识别图像中的角点。
灰度游程长度矩阵
灰度游程长度矩阵(RLM)是一种描述图像中连续相同灰 度级像素组成的“游程”的统计方法。它通过计算游程的 长度、方向和变化频率,来描述图像的纹理特征。
灰度游程长度矩阵可以用于图像的边缘检测、纹理分类和 增强等应用。
灰度自相关函数
灰度自相关函数(ACF)是一种描述图像中像素灰度级与其相邻像素灰度级之间 关系的函数。它通过计算像素灰度级与其相邻像素灰度级的相似程度,来描述图 像的纹理特征。
马尔科夫随机场模型
总结词
马尔科夫随机场模型是一种概率图模型,用于描述图像中像素之间的空间依赖关系。
详细描述
马尔科夫随机场模型基于马尔科夫链蒙特卡洛方法,通过定义像素之间的转移概率和状态概率,能够 模拟图像中的纹理、边缘和形状等特征。马尔科夫随机场模型在图像分割、图像恢复和图像识别等领 域有广泛应用。

数字图像处理(直方图).

数字图像处理(直方图).

21
其他类型的统计图
• 误差条:errorbar x = 1:10; y = sin(x); e = std(y)*ones(size(x)); errorbar(x,y,e)
22
其他类型的统计图
• 针状图:stem x = 1:60; y = sin(x/4); stem(x,y,'markerFace','b');
explode
17
环形饼图
ph = pie([2 4 3 5],{'North','South','East','West'}); hold on; z = 0.6*exp(i*linspace(0,pi*2,100)); fill(real(z),imag(z), 0.8*[1,1,1]);
18
二阶导数:
f m, n 1 f m, n 1 2 f m, n f x m, n , 2 x
[1 -2 1]
算子(Operator)
31
点操作
Y = F (X)
32
大局域操作
JP i, j G G IP i, j
38
for k = 1:1000
a(k) = a(k-1)+1; end 并行结构:a = [1:1000]+1;
6.递归过程
an = F(an-1) 计算过程中存在着相似的 部分,这里以阶乘为例 给出递归程序。
function y = fractorial(n); % 递归过程 if n==0; y=1; else y=fractorial(n-1)*n; end

数字图像直方图统计报告

数字图像直方图统计报告

一、学习情况
灰度直方图均衡化进行数字图像处理的基本原理
01
直方图均衡化:利用这一特性对图像中像素个数多的灰度 级进行展宽,而对图像中像素个数少的灰度进行压缩,从
而提高了对比度和灰度色调的变化,使图像更加清晰。
实现步骤: (1) 根据输入的灰度图像计算其原始直方图 (2) 对输入的原始直方图进行累加,计算其cdf (3) 使用累计分布函数的线性插值计算新的灰度值
一、学习情况
Matlab仿真
02
Imhist():直接显示图像的灰度直方图
均衡化: (1) 根据输入的灰度图像计算其原始直方图 (2) 对输入的原始直方图进行累加,计算其cdf (3) 使用累计分布函数的线性插值计算新的灰度值
二、已完成的工作及仿
真结果
二、已完成的工作及仿真结果 1 MATLAB仿真
阈值为100 200
阈值为120 200
阈值为140 180
阈值为150 170
由思考题得出的结论
阈值选择在波谷时,图片黑白分化更加明 显,对比度有所增强,当阈值靠近波峰时, 丢失信息过多,图片失真较为严重。
仿真1 MATLAB仿真
2 修改程序课后题的完成结果
双峰阈值分割法
在一些简单的图像中,物体的灰度分布比较有 规律,背景与各个目标在图像的直方图各自形 成一个波峰(区域与波峰一一对应),每两个 波峰之间会形成一个波谷,选择此波谷作为阈 值。
阈值为60 200
阈值为80 200
数字图像直方图均衡化增强实验 中期汇报
组员:张三
一、学习情况
一、学习情况
灰度直方图均衡化进行数字图像处理的基本原理
01
灰度直方图:横坐标是灰度级别,纵坐标是图像中该灰 度值的出现频率,是一个统计结果。

灰度直方图

灰度直方图

第三章灰度直方图目录1.灰度直方图2.直方图均衡化3.直方图规范化4.色彩直方图作业1.灰度直方图灰度直方图(histogram)是灰度级的函数,是图象的最基本的统计特征。

它表示图象中具有每种灰度级的象素的个数,反映图象中每种灰度出现的频率。

如下图所示,横坐标:灰度-r纵坐标:为某一灰度值ri的像素个数ni,或是灰度出现的概率P(r)从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应于概率密度函数pdf(probability density function),而概率分布函数就是直方图的累积和,即概率密度函数的积分,如下图所示:灰度直方图的计算是很简单的,依据定义,若图象具有L (通常L=256,即8位灰度级)级灰度,则大小为MxN的灰度图象f(x,y)的灰度直方图hist[0…L-1]可用如下计算获得:1.初始化hist[k]=0 ; k=0,…,L-12.统计hist[k] ; x, y =0,…,M-1, 0,…,N-13.如果需要标准化,则hist[k]/=M*N例:直方图算法实现例: 通过直方图求图像中的灰度的最大、最小和中值。

例:通过直方图求图像的亮度和对比度。

注2:图像的亮度和对比度图像的亮度(brightness ):即图像矩阵的平均值,其值越小越暗。

Brightness=图像的对比度(contrast ):即图像矩阵的均方差(标准差),对比度越大,图像中黑白反差越明显。

Contrast=1100(,)MN y x g x y M N −−==×∑∑11200((,))M N y x M Ng x y brightness −−==×−∑∑1)unsigned long hist[256]; unsigned char *pCur;for(int i=0;i<256;i++)hist[i]=0;int ImgSize=width*height;for(i=0,pCur=pImg;i<ImgSize;i++) hist[*(pCur++)]++;2)for (g=255;g>=0;g--)if (hist[g])break;maxGray=g;for (g=0;g<256;g++)I f (hist[g])break;minGray=g;for(g=sum=0;g<256;g++) {sum+=hist[g];if (sum>=ImgSize/2)break;}medGray=g;3)for(g=sum=0;g<256;g++)sum+=g*hist[g];brightness=1.0*sum/ImgSize;for(g=sum=0;g<256;g++)sum+= (g-brightness)* (g-brightness)*hist[g]; contrast=sqrt(sum/ImgSize);直方图具有很多的优点,直方图能反映图象的概貌,比如图像中有几类目标,目标和背景的分布如何;通过直方图可以直接计算图像中的最大亮度、最小亮度、平均亮度、对比度以及中间亮度等。

图像灰度直方图

图像灰度直方图

图像灰度直⽅图图像灰度直⽅图 图像是由像素点构成的,每个像素点的值代表着该点的颜⾊(灰度图或者彩⾊图)。

直⽅图就是对图像中的这些像素点的值进⾏统计,得到⼀个统⼀的整体的灰度概念。

优点:可以清晰了解图像的整体灰度分布,对于后⾯依据直⽅图处理图像来说⾄关重要。

⼀般情况下直⽅图都是灰度图像,直⽅图x轴是灰度值(⼀般0~255),y轴是图像中每⼀个灰度级对应的像素点的个数。

灰度级:正常情况下就是0-255共256个灰度级,从⿊⼀直到⽩(也有可能统计其中的某部分灰度范围),那么每⼀个灰度级对应⼀个数值代表该灰度对应的点数⽬。

也就是说直⽅图其实就是⼀个1*m(灰度级)的⼀个数组⽽已。

但是有的时候不希望逐个灰度的递增,⽐如现在要求20个灰度⼀起作为⼀个灰度级来画直⽅图,这个时候可能只需要1*(m/20)这样⼀个数组就够了。

那么这⾥的20就是直⽅图的间隔宽度了。

Opencv给提供的函数是cv2.calcHist(),该函数有5个参数:image输⼊图像,传⼊时应该⽤中括号[]括起来channels::传⼊图像的通道,如果是灰度图像,那就不⽤说了,只有⼀个通道,值为0,如果是彩⾊图像(有3个通道),那么值为0,1,2,中选择⼀个,对应着BGR各个通道,⽤[]传⼊。

mask:掩膜图像。

如果统计整幅图,那么为none。

如果要统计部分图的直⽅图,就得构造相应的炎掩膜来计算。

histSize:灰度级的个数,需要中括号,⽐如[256]ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,⽐如说你来回各种变换导致像素值负值、很⼤,则需要调整后才可以。

除Opencv外,numpy也有函数⽤于统计直⽅图的 函数np.histogram() 函数np.bincount() 这三个⽅式的传⼊参数基本上差不多,不同的是opencv⾃带的需要中括号括起来。

测试案例:import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread('02.jpg', 0)#直接读为灰度图像#opencv读取⽅法cv2.calcHist(速度最快)#图像,通道[0]-灰度图,掩膜-⽆,灰度级,像素范围hist_cv = cv2.calcHist([img], [0], None, [256], [0,256])#numpy⽅法读取np.histogram()hist_np,bins = np.histogram(img.ravel(), 256, [0,256])#numpy的另⼀种读取⽅法np.bincount()(速度=10倍⽅法2)hist_np2 = np.bincount(img.ravel(), minlength=256)plt.subplot(221), plt.imshow(img, 'gray')plt.subplot(222), plt.plot(range(256), hist_cv, 'r')plt.subplot(223), plt.plot(range(256), hist_np, 'b')plt.subplot(224), plt.plot(hist_np2)plt.show() opencv的直⽅图函数中掩膜的使⽤,这个掩膜就是⼀个区域⼤⼩,表⽰直⽅图统计就是这个区域的像素统计。

灰度直方图

灰度直方图

灰度直方图灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率.如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用probability density function(PDF)来刻画和描述,表现为灰度直方图.灰度直方图- 性质直方图英文名称是(HISTOGRAM),相机上显示的直方图和PHOTOSHOP使用的直方图都是灰度直方图,从图形上说,它是一个二维图,,用坐标表示。

横坐标表示图象中各个像素点的灰度级.(0到255个级别,一般人眼能够分辨的只有32个级别,人眼对光的强度变化非常敏感,而对颜色的变化就比较弱,目前,流行的视频压缩软件都是应用这一原理,比如RM)它是多种空间域处理技术的基础.直方图操作能够有效用于图像增强;提供有用的图像统计资料,其在软件中易于计算,适用于商用硬件设备.纵坐标为各个灰度级上图象各个像素点出现的次数或概率.各个软件细分程度不同.1。

表征了图像的一维信息。

只反映图像中像素不同灰度值出现的次数(或频数)而未反映像素所在位置.2.与图像之间的关系是多对一的映射关系。

一幅图像唯一确定出与之对应的直方图,但不同图像可能有相同的直方图。

3.子图直方图之和为整图的直方图.灰度直方图—处理以通过直方图的状态来评断图像的一些性质:明亮图像的直方图倾向于灰度级高的一侧;低对比度图像的直方图窄而集中于灰度级的中部,高对比度图像的直方图成分覆盖的灰度级很宽而且像素的分布没有不太均匀,只有少量的垂线比其他高许多。

直观上来说:若一幅图像其像素占有全部可能的灰度级并且分布均匀,则这样的图像有高对比度和多变的灰度色调。

从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应于概率密度函数,而概率分布函数就是直方图的累积和,即概率密度函数的积分。

灰度直方图—均衡化直方图均衡化是通过灰度变换将一幅图象转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程.使直方图均衡化的灰度变换函数是累积分布函数(概率分布函数);在离散情况下直方图不可能作到绝对的一致;基本算法事例:有一幅图象,共有16级灰度,其直方图分布为Pi,i=0,1,…,15,求经直方图均衡化后,量化级别为10级的灰度图象的直方图分布Qi,其中Pi和Qi为分布的概率,即灰度i出现的次数与总的点数之比。

图像灰度直方图

图像灰度直方图

2.4
图像灰度直方图
3.一幅图像分成多个区域,多个区域的直 方图之和即为原图像的直方图。
图像的直方图H(i) = 区域Ⅰ的直方图H1(i) + 区域Ⅱ的直方图H2(i)
2.4
图像灰度直方图
三、直方图的应用
1 . 数字化参数(判断量化是否恰当)
直方图给出了一个简单可见的指示,用 来判断一幅图象是否合理的利用了全部被允 许的灰度级范围。一般一幅图应该利用全部 或几乎全部可能的灰度级,否则等于增加了 量化间隔。丢失的信息将不能恢复。

最常用的方式是将图像各像素用一维或二维数 组相应的各元素加以存储。除此之外,还有下 列方式。
2.6图像的数据结构与特征
1.组合方式 组合方式是一个字长存放多个像素灰度值的方 式。它能起到节省内存的作用,但导致计算量 增加,使处理程序复杂。
图像处理 解压 压缩
组合方式
2.6图像的数据结构与特征
2.6图像的数据结构与特征
2.特征提取 获取图像特征信息的操作称作特征提取。它 作为模式识别、图像理解或信息量压缩的基础 是很重要的。 通过特征提取,可以获得特征构成的图像 (称作特征图像)和特征参数。
2.6图像的数据结构与特征
3.特征空间 对于由图像中提取出的特征量,利用特征空 间这一定义,可应用于模式分类等方面。把从 图像提取的m个特征量y1,y 2,…,ym,用m维 的向量Y=[y1 y2…ym]t表示称为特征向量。另 外,对应于各特征量的m维空间叫做特征空间, 那么特征向量Y就可作为这个特征空间的点来 表示。
在对输入图像处理时,计算某一输出像素 JP(i,j)值由输入图像IP(i,j)像素的小邻域 N(i,j)中的像素值确定。这种处理称为局部处 理,或者称邻域处理。局部处理的计算表达式 为

python实现灰度图像直方图统计与均衡化

python实现灰度图像直方图统计与均衡化

原创 python实现:灰度图像直方图统计与均衡化代码如下,重构过两次,使用面向对象设计,最后是效果图。

(原参考的代码是过程化的,并且命名比较难懂,我改进了一把)# coding=utf-8import cv2.cv as cvclass Image:def__init__(self,imagePath=None,imageData=None):if imagePath is not None:self.image = self._readImage(imagePath)returnif imageData is not None:self.image = imageDatareturndef _readImage(self,imagePath):return cv.LoadImage(imagePath,0)def show(self,windowName):cv.ShowImage(windowName, self.image)class Histogram:def __init__(self,image):self.image = imagedef _getIntensiveCount(self):analyst = Analyst()return analyst.getIntensiveCount(self.image)def _draw(self,lineColor):intensiveCount = self._getIntensiveCount()painter = Painter()returnpainter.drawPictureFromData(intensiveCount,lineColor) def show(self,windowName,lineColor):histogram = self._draw(lineColor)cv.ShowImage(windowName, histogram)class Accumulate:def __init__(self,image):self.image = imagedef _getIntensiveAccumulate(self):analyst = Analyst()return analyst.getIntensiveAccumulate(self.image) def _draw(self,lineColor):intensiveAccumulate =self._getIntensiveAccumulate()painter = Painter()returnpainter.drawPictureFromData(intensiveAccumulate,line Color)def show(self,windowName,lineColor):accumulate = self._draw(lineColor)cv.ShowImage(windowName, accumulate)class Equalizer:INTENSIVE_COUNT = 256INTENSIVE_RANK = 255def __init__(self,image):self.image = imagedef equalize(self):size = (self.image.width,self.image.height)depth = self.image.depthchannels = 1pixelCount = self.image.width * self.image.height equalizedImg = cv.CreateImage(size, depth, channels)accumulate =Analyst().getIntensiveAccumulate(self.image)probablity = accumulate[:]#注意,这里的pixelCount也可以用max(accumulate)得到for i in range(self.INTENSIVE_COUNT):#这里乘1.0是为了避免自动识别为整除probablity[i] = probablity[i]*1.0/pixelCountmapRelation = [0]*self.INTENSIVE_COUNTfor i in range(self.INTENSIVE_COUNT):mapRelation[i] =int(probablity[i]*self.INTENSIVE_RANK)for i in range(self.image.height):for j in range(self.image.width):equalizedImg[i,j] =mapRelation[int(self.image[i,j])]return equalizedImgclass Analyst:INTENSIVE_COUNT = 256def getIntensiveCount(self,image):intensiveCount = [0]*self.INTENSIVE_COUNTfor i in range(image.height):for j in range(image.width):intensiveValue = int(image[i,j])intensiveCount[intensiveValue] += 1return intensiveCountdef getIntensiveAccumulate(self,image):intensiveCount = self.getIntensiveCount(image) accumulate = intensiveCount[:]for i in range(1,self.INTENSIVE_COUNT):accumulate[i] = accumulate[i] + accumulate[i-1]return accumulateclass Painter:DRAW_DEPTH = 8DRAW_CHANNELS = 3DRAW_SIZE = (256,256)INTENSIVE_RANK = 255INTENSIVE_COUNT = 256def drawPictureFromData(self,data,lineColor):image = cv.CreateImage(self.DRAW_SIZE,self.DRAW_DEPTH, self.DRAW_CHANNELS)highest = max(data)for i in range(self.INTENSIVE_COUNT):#这里乘1.0是为了避免自动识别为整除#这句话的用意是为了拉伸图像,使其最大限度地布满画布data[i] = (data[i] * 1.0 / highest) *self.INTENSIVE_RANKdata[i] = int(data[i])bottomPoint = i, self.INTENSIVE_RANKtopPoint = i, self.INTENSIVE_RANK - data[i]cv.Line(image, bottomPoint, topPoint, lineColor) return imageif __name__ == "__main__":image = Image(imagePath='lena.jpg')image.show('original')Histogram(image.image).show('histogram',cv.RGB(0, 255, 0))Accumulate(image.image).show('accumulate',cv.RGB(0, 255, 0))equalizedImg =Image(imageData=Equalizer(image.image).equalize()) equalizedImg.show('equalized')Histogram(equalizedImg.image).show('ehistogram', cv.RGB(0, 0, 255))Accumulate(equalizedImg.image).show('eaccumulate', cv.RGB(0, 0, 255))cv.WaitKey(0)。

【数字图像处理】灰度图像二值化

【数字图像处理】灰度图像二值化

【数字图像处理】灰度图像⼆值化灰度图像每副图像的每个像素对应⼆维空间中⼀个特定的位置,并且有⼀个或者多个与那个点相关的采样值组成数值。

灰度图像,也称为灰阶图像,图像中每个像素可以由0(⿊)到255(⽩)的亮度值(Intensity)表⽰。

0-255之间表⽰不同的灰度级。

灰度图像⼆值化⼆值化:以⼀个值(阈值)为基准,⼤于(等于)这个值的数全部变为是1(或者0),⼩于等于这个数的就全部将他们变为0(或1)。

⼆值化算法处理飞思卡尔赛道思路:设定⼀个阈值valve,对于图像矩阵中的每⼀⾏,从左⾄右⽐较各像素值和阈值的⼤⼩,若像素值⼤于或等于阈值,则判定该像素对应的是⽩⾊赛道;反之,则判定对应的是⿊⾊的⽬标引导线。

记下第⼀次和最后⼀次出现像素值⼩于阈值时的像素点的列号,算出两者的平均值,以此作为该⾏上⽬标引导线的位置。

摄像头的⼆值化的代码:Void image_binaryzation(){for(int i=0;i{for(int j=0;j{if(Image[i][j] >= Threshold)Image_new[i][j]=1;elseImage_new[i][j]=0;}}}Row是对应采集到的⾏数,Col是列数,Image[i][j]是摄像头采集未⼆值化的数据存放的数组,Img[i][j]是新建的存放⼆值化后的数组。

合适的阈值在阈值⼆值化中,最主要的是选取合适的阈值,这也是⼆值化的难点所在。

常⽤的⼆值化阈值选取⽅法有双峰法、p参数法、⼤律法(Otsu法)、最⼤熵阈值法、迭代法等。

⼤律法(Otsu法)Otsu⽅法⼜名最⼤类间差⽅法,通过统计整个图像的直⽅图特性来实现全局阈值T的⾃动选取,其算法步骤为:1) 先计算图像的直⽅图,即将图像所有的像素点按照0~255共256个bin,统计落在每个bin的像素点数量2) 归⼀化直⽅图,也即将每个bin中像素点数量除以总的像素点3) i表⽰分类的阈值,也即⼀个灰度级,从0开始迭代4) 通过归⼀化的直⽅图,统计0~i 灰度级的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的⽐例w0,并统计前景像素的平均灰度u0;统计i~255灰度级的像素(假设像素值在此范围的像素叫做背景像素) 所占整幅图像的⽐例w1,并统计背5) 计算前景像素和背景像素的⽅差 g = w0*w1*(u0-u1) (u0-u1)6) i++;转到4),直到i为256时结束迭代7)将最⼤g相应的i值作为图像的全局阈值缺陷:OSTU算法在处理光照不均匀的图像的时候,效果会明显不好,因为利⽤的是全局像素信息。

实验一_灰度图像直方图统计

实验一_灰度图像直方图统计

实验一 灰度图像直方图统计一. 实验目的掌握灰度图像直方图的概念和计算方法,了解直方图的作用和用途。

能初步掌握图像文件格式的读写与图像数据处理,提高学生兴趣,巩固所学知识。

二. 实验内容和要求(1) 用Photoshop 显示图像的灰度直方图,从直方图上了解图像平均明暗度和对比度等信息;(2) 读取和显示一幅灰度图象;(3) 编写直方图统计的程序。

三.实验原理1.了解灰度直方图定义灰度直方图反映的是一幅图像中各灰度级像素出现的频率。

以灰度级为横坐标,纵坐标为灰度级的频率,绘制频率同灰度级的关系图就是灰度直方图。

它是图像的一个重要特征,反映了图像灰度分布的情况。

2.了解直方图的绘制原理频率的计算公式为: 1) 统计图像中像素的总个数n ;2) 找出图像中灰度级的分布范围,0~i ;3) 统计出图像中每个灰度对应的像素的个数ni;4) 用公式计算出每个灰度级像素出现的频率 5)以灰度级为横坐标,纵坐标为灰度级的频率,绘制出直方图;3.图像二值化的原理将256个亮度等级的灰度图像通过适当的阈值选取,获得仍然可以反映图像整体和局部特征的二值化图像。

在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。

使用直方图方法来寻找二值化阈值,该方法选择二值化阈值主要是发现图像的两个最高的峰,阈值取值在两个峰之间的峰谷最低处。

所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,小于阈值的像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。

四.实验步骤1. 用Photoshop 显示直方图:nn v ii =nn v ii =Photoshop软件是Adobe发行的功能强大的图像处理软件,简称“PS”,Photoshop主要处理以像素所构成的数字图像。

其处理过程直观,速度快,在平常编写专业图像处理算法前,一般会用photoshop先分析下图像的特征等等。

图像灰度直方图

图像灰度直方图

灰度级数反映了一幅数字图像的亮度层次多少。 图像数据的层次越多视觉效果就越好。
一般来说,G 2g ,g就是表示存储图像像素灰度 值所需的比特位数。
若 一 幅 数 字 图 像 的 量 化 灰 度 级 数 G=256=28 级 , 灰 度取值范围一般是0~255的整数,由于用8bit就能表示灰 度图像像素的灰度值,因此常称8 bit 量化。
B1 G1 R1 B2 G2 R2
: Bn Gn Rn
对于真彩色图,3个字节才能表示1个像素.
2.4图像灰度直方图
2.4.1 概念 一、定义
灰度直方图反映的是一幅图像中各灰度级像素出现 的频率。以灰度级为横坐标,纵坐标为灰度级的频率, 绘制频率同灰度级的关系图就是灰度直方图。它是图像 的一个重要特征,反映了图像灰度分布的情况。
2.3图像数字化
图像数字化是将一幅画面转化成计算机能处理的形式—— 数字图像的过程。
模拟图像
数字图像
正方形点阵
2.3.1采样
将连续的图像空间上变换成离散点的操作称为采样。 采样孔b)
(a) 正方形网格; (b) 正六角形网格
采样间隔和采样孔径的大小是两个很重要的参 数。
采样间隔越小, 所得图像像素数越 多,空间分辨率高, 图像质量好,但数
据量大。
量化等级越多,所 得图像层次越丰富,灰 度分辨率高,图像质量 好,但数据量大;
量化等级越少,图 像层次欠丰富,灰度分 辨率低,会出现假轮廓 现象,图像质量变差, 但数据量小。
但在极少数情况下 对固定图像大小时,减 少灰度级能改善质量, 产生这种情况的最可能 原因是减少灰度级一般 会增加图像的对比度。 例如对细节比较丰富的 图像数字化。
下图是一幅图像的灰度直方图。

lbp特征计算量

lbp特征计算量

lbp特征计算量LBP(Local Binary Patterns)是一种用于图像特征提取的方法,它能够有效地对图像纹理进行描述。

LBP算法主要包括计算LBP特征和统计LBP直方图两个步骤。

LBP特征计算量主要包括两个方面:计算LBP图像和统计直方图。

下面将详细介绍每个步骤的计算量。

1.计算LBP图像LBP算法首先将图像转化为灰度图像,然后对每个像素点计算LBP值。

对于每个像素点,需要考虑其相邻的8个像素点,根据这些像素点的灰度值与中心像素点灰度值的大小关系,将其转换为二进制数,并将这个二进制数转化为十进制数作为LBP值。

因此,针对图像中的每个像素点,都需要考虑8个相邻像素点,计算8次比较、8次位移、8次二进制转换和8次十进制转换。

假设图像的尺寸为N×N,那么计算一个像素点的LBP值的时间复杂度为O(1),计算整个图像的LBP图像的时间复杂度为O(N^2)。

2.统计LBP直方图统计LBP直方图是指对LBP图像中的每个LBP值进行统计,得到一个256维的直方图。

对于每个像素点的LBP值,需要在直方图相应的位置进行累加。

假设图像的尺寸为N×N,那么统计一个像素点的LBP直方图的时间复杂度为O(1),统计整个图像的LBP直方图的时间复杂度为O(N^2)。

综上所述,LBP特征计算量的总体时间复杂度为O(N^2)。

对于大型图像,计算LBP特征会耗费较长的时间。

为了减少计算量,可以采取一些优化方法,如使用图像金字塔进行尺度空间的计算,或者使用快速LBP算法进行加速计算。

此外,还可以利用多线程和并行计算来加速LBP特征的计算过程。

02 第三章 灰度直方图

02 第三章 灰度直方图

11
3.3 直方图的用途 直方图的用途 3.3.1 数字化参数
直方图给出了一个简单可见的指示, 直方图给出了一个简单可见的指示,用 来判断一幅图象是否合理地利用了全部被允 是否合理地利用了 来判断一幅图象是否合理地利用了全部被允 许的灰度级范围。 许的灰度级范围。一般一幅数字图象应该利 用全部或几乎全部可能的灰度级, 如图3.1。 用全部或几乎全部可能的灰度级 , 如图 。 否则等于增加了量化间隔。 否则等于增加了量化间隔。一旦被数字化图 象的级数少于256, 丢失的信息 ( 除非重新 象的级数少于 , 丢失的信息( 数字化)将不能恢复。 见下页典型直方图。 数字化) 将不能恢复。 见下页典型直方图。
26
2. 有一幅在灰色背景下的黑白足球的图 有一幅在灰色背景下的黑白足球的图 灰色背景下的黑白足球 象,直方图如下所示。足球的直径为230mm, 直方图如下所示。足球的直径为 , 求其象素间距。 求其象素间距。 象素间距 [0 520 920 490 30 40 5910 24040 6050 80 20 80 440 960 420 0]
29
作业
步骤1: 选一幅彩色图转换成灰度图, 步骤 : 选一幅彩色图转换成灰度图 , 或 直接选一幅灰度图,画出它的直方图, 直接选一幅灰度图,画出它的直方图,选一个 合适的阈值,将该图像二值化。 合适的阈值,将该图像二值化。 步骤2: 将该图像作水平方向( 步骤 : 将该图像作水平方向 ( 或垂直方 或斜方向) 点或2点移位 向、或斜方向)的1点或 点移位,形成第二幅 点或 点移位, 图像。 图像。 步骤3:将两幅图像做减法,分析结果。 步骤 :将两幅图像做减法,分析结果。 步骤4:如果位移量较大,结果会如何? 步骤 :如果位移量较大,结果会如何?
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.灰度图像直方图统计实习报告
一、实习目的
在学习灰度图像直方图的概念、计算方法、性质和相关应用的基础上,应用Photoshop软件和编写灰度直方图统计程序,能初步掌握图像文件格式读写与图像数据处理,提高学生兴趣和编程能力,巩固所学知识。

二、实习内容
1.实习数据 E:\ 数字图像处理\实习一\Lena.raw
2.利用Photoshop显示图像的灰度直方图,从直方图上了解图像平均明暗度和对比度等信息。

3.要求利用C或C++语言编写灰度图像直方图统计的程序。

三、实习步骤
1.使用Photoshop显示直方图。

(1)点击“文件”-->“打开”,打开一幅图像,此处选取“lena.raw”;
(2)点击“图像”-->“直方图”,显示图像的直方图;
(3)对图像做增强处理,例如选择“图像”-->“调整”-->“自动对比度”对图像进行灰度拉伸,然后再显示直方图,观察它的变化。

2.用C或C++编写显示直方图的程序。

具体代码如下:
#include "stdio.h"
#include "windows.h"
void main()
{
FILE *fp; //文件类指针
fp=fopen("lena.raw","rb"); //打开二进制文件
if (fp==NULL) { printf("文件已损坏,请重新打开。

\n"); }
else printf("文件已打开,已经生成.txt文档,请查看。

\n");
BYTE PIXEL[512*512];
fread(PIXEL,1,512*512,fp);//二进制文件读取
fclose(fp);//关闭文件
int HistogramStat[256];
for(int i=0;i<256;i++) HistogramStat[i]=0;//赋初值
for (i=0;i<512*512;i++)
{
int a=PIXEL[i];
HistogramStat[a]++;
} //统计像素个数
fp=fopen("灰度直方图.txt","rb");
fprintf(fp,"图像灰度,像素个数\n");
for (i=0;i<256;i++)
{ if (HistogramStat[i]!=0)
fprintf(fp,"%5d,%5d\n",i,HistogramStat[i]);
}
fprintf(fp,"像素个数为0的已被省略。

");//输出内容
}
四、思考题
1灰度直方图可以反映出一幅图像的哪些特性?
答:(1)表征了图像的一维信息。

只反映图像中像素不同灰度出现的次数,而未反映像素所在的位置。

即丢失了像素的位置信息。

(2)与图像之间的关系式多对一的映射关系。

一幅图像唯一确定出与之对应的直方图,但不同的图像可能有相同的直方图。

(3)一幅图像可分为多个子区域,子图直方图之和为整图的直方图。

2灰度直方图有何用途?编程实现一种灰度直方图应用的程序。

答:(1)用于判断图像量化是否恰当。

(2)用于确定图像的二值化阈值。

(3)计算图像中物体的面积。

(4)计算图像信息量H(熵)。

3在本次实习的基础上,试编写直方图均衡的程序。

五、实习心得体会
通过这次实习我对灰度直方图的概念和灰度直方图的计算方法以及性质有了更深的了解,对C语言的函数利用操作及文件操作有了更深层次的认识,对Photoshop软件有了一定的了解。

此次实习增强了我的编程能力,使我初步掌握图像文件格式读写与图像数据处理,巩固近期数字图像处理课程上所学知识。

相关文档
最新文档