-
归一化灰度直方图 Matlab
2016-08-04 21:30:55图像直方图描述的是图像各个灰度级的统计特性,他表示图像每一灰度级与该灰度级...那么Ng--g构成灰度直方图,Pg--g构成归一化灰度直方图。 用matlab实现,imhist(I),imhist(I,n)表示将灰度级均匀分成n个小区间,[co图像直方图描述的是图像各个灰度级的统计特性,他表示图像每一灰度级与该灰度级出现频率的对应关系,因为灰度级不是连续的,自然,灰度直方图是一个离散函数。横坐标是灰度级g,纵坐标是Ng,如果总的像素是N,灰度级为L,Pg=Ng/N。那么Ng--g构成灰度直方图,Pg--g构成归一化灰度直方图。
用matlab实现,imhist(I),imhist(I,n)表示将灰度级均匀分成n个小区间,[counts,x]=imhist(...)返回每个灰度区间的像素数目和对应的灰度小区间的向量。用stem(x,counts)可以画出灰度直方图。
I=imread('pout.tif'); L=rgb2gray(I);%%转化成我们熟悉的二值图像,也就是二值灰度图像。 [M,N]=size(L); [counts,x]=imhist(L,32); counts=counts/M/N; stem(x,counts);
效果:
-
MATLAB灰度直方图
2017-11-15 12:12:50MATLAB中的灰度直方图的代码,有一般直方图,归一化直方图,彩色图像读取绘制直方图 -
计算灰度图像的归一化直方图
2015-04-29 23:52:18利用OpenCV 对图像像素进行操作,计算归一化直方图,并在窗口中以图形的方式显示出来。利用OpenCV 对图像像素进行操作,计算归一化直方图,并在窗口中以图形的方式显示出来。
具体代码如下:
//一、归一化直方图 #include "stdafx.h" #include <cvaux.h> #include <highgui.h> int _tmain_1(int argc, _TCHAR* argv[]) { IplImage * src = cvLoadImage("1.jpg"); IplImage* gray_plane = cvCreateImage(cvGetSize(src),8,1); cvCvtColor(src,gray_plane,CV_BGR2GRAY); int hist_size = 256; //直方图尺寸 int hist_height = 256; float range[] = {0,255}; //灰度级的范围 float* ranges[] = {range}; //创建一维直方图,统计图像在[0,255]像素的均匀分布 CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1); //计算灰度图像的一维直方图 cvCalcHist(&gray_plane,gray_hist,0,0); //归一化直方图 cvNormalizeHist(gray_hist,1.0); int scale = 2; //创建一张一维直方图的“图像”,横坐标为灰度级,纵坐标为像素个数(*scale) //图像位深度为8位整形,每个元素通道号为3 IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height),8,3); //初始化,图像清零 cvZero(hist_image); //统计直方图中的最大直方块 float max_value = 0; cvGetMinMaxHistValue(gray_hist,0,&max_value,0,0); //分别将每个直方块的值绘制到图中 for(int i=0;i<hist_size;i++) { float bin_val = cvQueryHistValue_1D(gray_hist,i);// int intensity = cvRound(bin_val*hist_height/max_value); cvRectangle(hist_image, cvPoint(i*scale,hist_height-1), cvPoint((i+1)*scale-1,hist_height-intensity), CV_RGB(255,255,255)); } cvNamedWindow("GraySource",1); cvShowImage("GraySource",gray_plane); cvNamedWindow("H-S Histogram",1); cvShowImage("H-S Histogram",hist_image); cvWaitKey(0); return 0; }
-
灰度直方图与直方图均衡化
2018-09-14 08:29:40灰度直方图即将一张图的颜色统计出来,以8位灰度图像为例,每个像素的颜色灰度在0-255之间,现在需要统计出每个颜色在图像中出现的频次,横坐标为0-255,纵坐标为频次,或归一化后为概率(即将每个灰度值出现的次数...灰度直方图即将一张图的颜色统计出来,以8位灰度图像为例,每个像素的颜色灰度在0-255之间,现在需要统计出每个颜色在图像中出现的频次,横坐标为0-255,纵坐标为频次,或归一化后为概率(即将每个灰度值出现的次数除以总像素个数)。
以下图为例:
可以发现边缘处的灰度值出现的频次较少。可以用直方图均衡化方法来增强图像
因为直方图均衡化处理之后,原来比较少像素的灰度会被分配到别的灰度去,像素相对集中, 处理后灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
均衡化方法:下面几张图来源于 https://www.cnblogs.com/tianyalu/p/5687782.html
假设有如下图像:
得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:
映射后的图像如下所示:
原图图处理后效果以及处理后图像的灰度直方图如下:
Python 处理代码如下:
from PIL import Image import matplotlib.pyplot as plt def norm(L): """ 将频次归一化转为概率 """ s = sum(L) for i in range(len(L)): L[i] /= s return L def getColorDensity(img): """ 返回图像的颜色概率密度 x为图像灰度,y为密度,且一一对应 """ if img.mode!="L": print("需传入灰度图像") return None,None x=[] y=[] colors = img.getcolors() #print(colors) if colors==None: print("colos out of range") return None,None for i in colors: x.append(i[1]) y.append(i[0]) y = norm(y) return x,y def drawGrayBar(img): """ 绘制灰度直方图 """ x,y = getColorDensity(img) if x==None: return plt.bar(x,y) plt.show() def GrayNorm(img,lRange=0,hRange=255): """ 灰度均衡化 """ desImg = Image.new(img.mode,(img.width,img.height)) delta = hRange - lRange grayNum,prop = getColorDensity(img) if grayNum == None: return colorTab = {}#colorTab是一个字典,key为原图某像素的灰度值,value为此灰度转化后的灰度, prop_total=0 for i in range(len(prop)): prop_total += prop[i] prop[i] = round(prop_total * delta) #将每个像素颜色值使用累积概率密度相乘得到转化后的灰度 colorTab[grayNum[i]] = prop[i] #遍历图像所有像素,将像素值灰度置位均衡化后的灰度 for x in range(img.width): for y in range(img.height): gray_origin = img.getpixel((x,y)) desImg.putpixel((x,y),colorTab[gray_origin])#由于是灰度图,所以后面只需要传一个参数即灰度。若为真彩色,则传一个元组 return desImg img = Image.open("D:\\lena_gray.jpg") desImg = GrayNorm(img) drawGrayBar(desImg)
-
数字图像处理(15): 灰度直方图(matplotlib 和OpenCV 绘制直方图)
2019-05-04 09:29:221 灰度直方图简介 1.1 灰度直方图概念 1.2 灰度直方图作用 1.3 绘制的直方图 1.4 归一化直方图 2 matplotlib库 绘制直方图-hist() 3 OpenCV库 绘制直方图-calcHist() 参考资料 1 灰度直方图简介 1.1 灰度...目录
1 灰度直方图简介
1.1 灰度直方图概念
灰度直方图(histogram)是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。其中,横坐标是灰度级,纵坐标是灰度级出现的频率。
1.2 灰度直方图作用
1)在使用轮廓线确定物体边界时,通过直方图更好的选择边界阈值,进行阈值化处理;
2)对物体与背景有较强对比的景物的分割特别有用;
3)简单物体的面积和综合光密度IOD可以通过图像的直方图求得。
1.3 绘制的直方图
假设存在一个 3
3 的图像,如下图所示,数组
统计的是像素点的灰度级,数组
统计的是具有该灰度级的像素个数。其中,灰度为1的像素共3个,灰度为2的像素共1个,灰度为3的像素共2个,灰度为4的像素共1个,灰度为5的像素共2个。
= [1, 2, 3, 4, 5]
= [3, 1, 2, 1, 2]
根据上面的数据,绘制的直方图如下所示:
如果灰度级为0-255(最小值0黑色,最大值255白色),同样可以绘制对应的直方图,下图是三张图片拼接而成及其对应的直方图。
1.4 归一化直方图
该直方图的横坐标表示图像中各个像素点的灰度级,纵坐标表示出现这个灰度级的概率。其计算方法如下:
(1) 先计算灰度级及对应像素的个数
= [1, 2, 3, 4, 5]
= [3, 1, 2, 1, 2]
(2) 统计总的像素个数
= (3 + 1 + 2 + 1 +2) = 9
(3) 统计各个灰度级的出现概率
=
= [3/9, 1/9, 2/9, 1/9, 2/9]
2 matplotlib库 绘制直方图-hist()
使用matplotlib的子库pyplot实现,它提供了类似于Matlab的绘图框架,matplotlib是非常强大基础的一个Python绘图包。其中绘制直方图主要调用 hist() 函数实现,它根据数据源和像素级绘制直方图。
hist()函数形式如下:
hist(数据源, 像素级)
其中,参数:
数据源:必须是一维数组,通常需要通过函数 ravel() 拉直图像
像素级:一般是256,表示[0, 255]
函数 ravel() 将多维数组降为一维数组,其格式为:
一维数组 = 多维数组.ravel()
代码如下所示:
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt src = cv2.imread('zxp.jpg') cv2.imshow("src", src) plt.hist(src.ravel(), 256) plt.show() cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下图所示:
上述是调用 matplotlib库 中的hist() 函数来绘制直方图,接下来介绍使用OpenCV库中的calcHist() 函数绘制直方图。
3 OpenCV库 绘制直方图-calcHist()
使用OpenCV库中的 calcHist() 函数来绘制直方图:
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
其中,参数:
hist 表示直方图,返回的是一个二维数组;
images 表示原始图像;
channels 表示指定通道,通道编号需要用中括号括起,输入图像是灰度图像时,它的值为[0],彩色图像则为[0]、[1]、[2],分别表示B、G、R;
mask 表示掩码图像,统计整副图像的直方图,设为None,统计图像的某一部分直方图时,需要掩码图像;
histSize 表示BINS的数量,参数子集的数目,如下图当bins=3表示三个灰度级;
ranges 表示像素值范围,例如[0, 255];
accumulate 表示累计叠加标识,默认为false,如果被设置为true,则直方图在开始分配时不会被清零,该参数允许从多个对象中计算单个直方图,或者用于实时更新直方图;多个直方图的累积结果用于对一组图像的直方图计算。
(1)计算图像灰度级的基本大小、形状及内容
代码如下所示:
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt src = cv2.imread('zxp.jpg') # 参数:原图像 通道[0]-B 掩码 BINS为256 像素范围0-255 hist = cv2.calcHist([src], [0], None, [256], [0,255]) print('type=',type(hist)) print('size=',hist.size) print('shape=',hist.shape) print("-------------------") print('hist=',hist)
运行结果如下图所示:
由上面的结果可知:
(1)直方图是一个数组;
(2)大小为256,;
(3)形状为256行,1列的数组。
(2)补充:matplotlib库 绘制图像
代码如下所示:
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #绘制sin函数曲线 x1 = np.arange(0, 6, 0.1) y1 = np.sin(x1) plt.plot(x1, y1) #绘制坐标点折现 x2 = [0, 1, 2, 3, 4, 5, 6] y2 = [0.3, 0.4, 2.5, 3.4, 4, 5.8, 7.2] plt.plot(x2, y2) #省略有规则递增的x2参数 y3 = [0, 0.5, 1.5, 2.4, 4.6, 8] plt.plot(y3, color="r") plt.show()
运行结果如下图所示:
(3)使用OpenCV库 中的 calcHist() 函数 计算B、G、R通道的灰度级并绘制图形
代码如下所示:
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt src = cv2.imread('zxp.jpg') histb = cv2.calcHist([src], [0], None, [256], [0,255]) histg = cv2.calcHist([src], [1], None, [256], [0,255]) histr = cv2.calcHist([src], [2], None, [256], [0,255]) cv2.imshow("src", src) plt.plot(histb, color='b') plt.plot(histg, color='g') plt.plot(histr, color='r') plt.show() cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下图所示:
参考资料
[1] https://blog.csdn.net/Eastmount/article/details/83758402
-
绘制灰度直方图
2015-04-20 21:31:51利用 OpenCV 对图像像素进行操作, 计算归一化直方图。并在窗口中绘制灰度直方图。 -
图像的灰度直方图
2017-03-01 20:00:36图像直方图: 从数学上来说,图像直方图描述的是图像的... 从图形上来说,灰度直方图是一个二维直方图,横坐标为图像中各个像素点的灰度级别,纵坐标表示具有各个灰度级别的像素在图像中出现的概率。 /*--- -
matlab 直方图的求解及归一化直方图
2016-10-24 20:11:04I=imread('clock.jpg'); 当读取图像直方图时,出现 就是图像是彩色的先把...然后就会显示出灰度直方图啦 然后归一化直方图: >> [m,n]=size(b); >> [counts ,x]=imhist(b,32); >> counts=counts/m/n; -
【OpenCV入门指南】第九篇 灰度直方图均衡化
2012-12-24 09:28:19上一篇《OpenCV第八篇灰度直方...下面来看看灰度直方图均衡化的函数——cvEqualizeHist 一.cvEqualizeHist函数功能:直方图均衡化,该函数能归一化图像亮度和增强对比度函数原型:/* equalizes histogram of 8-bit s -
第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波7 - 直方图处理 - 直方图、归一化直方图
2021-02-04 13:29:13目录直方图处理 ...fff的非归一化直方图定义为: h(rk)=nk,k=0,1,2,…,L−1(3.6)h(r_{k}) = n_{k}, \quad k = 0, 1, 2, \dots, L-1 \tag{3.6}h(rk)=nk,k=0,1,2,…,L−1(3.6) nk是fn_{k}是fnk是f -
Matlab点运算之灰度直方图
2017-10-22 15:54:19% 灰度直方图 它描述了一副图像的灰度级统计信息,主要应用于图像分割和图像灰度变换等应用当中 % 从数学的角度来看,图像直方图描述的是图像各个灰度级别的统计特性,它是灰度值的函数,统计一副图像中各个灰度... -
图像的灰度级数越多越好_MATLAB-数字图像处理 图像直方图归一化
2021-01-06 18:49:59图像直方图归一化图像直方图概念:图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了...图像灰度直方图:一副数字图像有[0~255]灰度级,直方图定义如下:其中,是第k个灰度级(如:255),是该灰度级的个... -
matlab中图像强度归一化_MATLAB-数字图像处理 图像直方图归一化
2021-01-17 14:44:50图像直方图归一化图像直方图概念:图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了...图像灰度直方图:一副数字图像有[0~255]灰度级,直方图定义如下:其中,是第k个灰度级(如:255),是该灰度级的个... -
直方图均衡化技术实现图像的灰度归一化
2020-02-24 20:31:29I=imread('D:\project1.jpg'); I=im2double(I); [M,N]=size(I); figure(1); imshow(I); title('source'); figure(2); [H,x]=imhist(I,32); stem(x,(H/M/N),'.'); title('source1');... 进行直方图均衡化处理: -
使用MATLAB进行灰度直方图的绘制,线性变换,对数变换,指数变换
2020-02-24 15:10:49绘制灰度直方图 原图: 一般直方图: 改变区间数: 归一化处理: -
灰度图像直方图代码
2013-10-09 20:31:41此代码很好的实现了灰度图像的直方图,内容很全,可以实现一般直方图和归一化直方图 -
灰度直方图均衡化的算数推导
2015-10-07 00:33:00假设r被归一化到[0,1],且r=0表示黑色,r=0表示白色。 对于连续函数,假设其变换函数为 (公式一) 在原始图像中,对于每一个r对应着一个灰度值s。其中变换函数要满足以下条件: T(r)在[0,1]中为单值,且... -
归一化mysql函数_matlab 直方图归一化
2021-02-05 14:13:25实际工作中,有时需要变换直方图使之成为某个特定的形状,从而有选择地增强某个灰度值范围内的对比度,这时可采用比较灵活的直方图规定化方法.直方图规定化增强处理的步骤如下:令Pr(r)和Pz(z)分别为原始图像和期望图像... -
Histogram Normalization 图像直方图归一化
2020-03-17 11:53:49一. 直方图归一化 有些灰度图像的像素并没有分布在 [0,255] 内,而是分布在 [0,255] 的子区间内。这样的图像肉眼看上去往往不是很清晰。... 这种归一化直方图的操作被称为灰度变换(Grayscale Trans... -
MATLAB-数字图像处理 图像直方图归一化
2019-09-02 21:16:05图像直方图归一化 图像直方图概念: 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像...图像灰度直方图:一副数字图像有[0~255]灰度级,直方图定义如下: 其中,是第k个灰度级(如:255),是该灰... -
【图像处理】——图像灰度直方图的绘制(直接调用函数和自定义函数)
2020-07-03 14:20:52灰度直方图是关于灰度级分布的函数,将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。 对图像中不同灰度级别出现的次数进行统计,统计后进行绘制...
-
用idea 输出 for循环代码11
-
JavaClassLoader原理详细分析
-
教务管理系统.zip
-
mysql多主模式/异地数据中心 部署详细文档
-
LitJson.zip
-
Vue:校验触发的时机,怎么选择trigger的值
-
Animegan:基于Animegan模型的图像风格化迁移Docker API服务-源码
-
白话:java从入门到实战
-
即构RoomKit:低代码15分钟搭建在线课堂,极速助力教培线上化转型
-
MySQL读写分离技术
-
物联网之mqtt实现(emqx+springboot+mqtt附源码)
-
桌面路径更改工具 .zip
-
redis分布式事务锁的使用,高并发下的减库存的实列使用
-
Java异常处理的十条建议
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
spring_AOP_jar.zip
-
java常用API使用方法(详细易懂)
-
数据倍增的网络时代,Filecoin前景无限!
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
产品管理:产品表单Java Swing应用程序-源码