灰度图像直方图统计
- 格式:docx
- 大小:455.17 KB
- 文档页数:4
图像处理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中出现的次数。
图像直方图均衡化原理
图像直方图均衡化是一种常用的图像增强方法,通过调整图像的像素灰度分布,使得图像的对比度增强、细节更加清晰。
其原理主要分为以下几个步骤:
1. 统计像素灰度值的分布:首先,对待处理的图像,统计每个灰度级别的像素点数量,得到原始图像的灰度直方图。
2. 计算累计分布函数:根据灰度直方图,计算每个灰度级别对应的累计分布函数,即该灰度级别及其之前的像素点的累积数量比例。
3. 灰度映射:对于每个像素点,将其灰度值通过累计分布函数进行映射,得到新的灰度值。
通常情况下,可以通过线性映射或非线性映射来实现,使得图像的灰度分布变得更加均匀。
4. 重构图像:将经过灰度映射处理后的灰度值替换原始图像中的对应像素点的灰度值,从而得到均衡化后的图像。
通过图像直方图均衡化处理,可以提高图像的对比度,使暗部和亮部细节更加突出,同时抑制了图像中灰度级别分布不均匀的问题。
这种方法在图像增强、图像分析等领域都有广泛应用。
一、概述在图像处理和计算机视觉领域,统计特定灰度值的个数是非常重要的一项工作。
而在使用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 图 像 直 方 图 统 计(一) 实验目的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图像处理工具有了较深的了解,对课堂上学习到的理论知识有了明确的认识、知道其在实际中的应用,对于以后的学习和工作都会有很大的帮助。
第三章灰度直方图目录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出现的次数与总的点数之比。
原创 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先分析下图像的特征等等。
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特征的计算过程。
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软件有了一定的了解。
此次实习增强了我的编程能力,使我初步掌握图像文件格式读写与图像数据处理,巩固近期数字图像处理课程上所学知识。