OpenCV图像直方图案例
直方图
一、直接使用直方图
1 import matplotlib.pyplot as plt2 import cv2 as cv3 def plot_demo(image):4 print(image.ravel()) ##ravel将图像3维转一维数组,便于统计频率5 # 统计为256个bin,直方图显示[0,256]所有的bin,意思是全部显示,我们可以设置只显示一部分[0,200]也可以6 plt.hist(image.ravel(), 256, [0, 256]) 7 plt.show()8 src = cv.imread('1.jpg')9 cv.imshow('inputimage',src) 10 plot_demo(src) 11 cv.waitKey(0) 12 cv.destroyAllWindows()
hist是256x1数组,每个值对应于该图像中其像素数与其相应像素值的数量。
二、使用opencv直方图
calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None):
推文:直方图
images:输入图像,必须用[ ]括起来
channels:需要统计直方图的第几通道,用于计算直方图的通道,使用灰度图计算直方图是,就直接用[0]
mask:掩膜,不使用的话写None
histSize:指的是直方图分成多少个区间,就是 bin的个数,表示这个直方图分成多少份(即多少个直方柱)
ranges: 统计像素值得区间,表示直方图中各个像素的值,[0.0, 256.0]表示直方图能表示像素值从0.0到256的像素。
hist:输出的直方图数组
最后是两个可选参数,由于直方图作为函数结果返回了,所以第六个hist就没有意义了(待确定)
最后一个accumulate是一个布尔值,用来表示直方图是否叠加。
accumulate=false:在多个图像时,是否累计计算像素值得个数
1 import cv2 as cv2 import matplotlib.pyplot as plt3 def hist_image(image):4 colors = ('blue','green','red')5 for i,color in enumerate(colors):6 hist = cv.calcHist([image],[i],None,[256],[0,256])7 plt.plot(hist,color=color)8 plt.xlim([0,256])9 plt.show() 10 img = cv.imread('1.jpg') 11 cv.imshow('img',img) 12 hist_image(img) 13 cv.waitKey(0) 14 cv.destroyAllWindows()
根据直方图的波峰可以判断图像的主要特征,可以用于图像的分割,根据各个波峰
四、直方图应用(均衡化和图像比较)
OpenCV直方图均衡化都是基于灰度图像
1、全局直方图均衡化(对比度增强)equalizeHist
函数equalizeHist的作用:直方图均衡化,提高图像质量。
直方图均衡化:如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。 它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。
全局直方图均衡化可能得到是一种全局意义上的均衡化,但是有的时候这种操作并不是很好,会把某些不该调整的部分给调整了。 Opencv中还有一种直方图均衡化,它是一种局部直方图均衡化,也就是是说把整个图像分成许多小块(比如按10*10作为一个小块),那么对每个小块进行均衡化。
全局的对比度太强
1 import cv2 as cv2 import matplotlib.pyplot as plt3 4 img = cv.imread('1.jpg') #OpenCV直方图均衡化都是基于灰度图像5 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)6 cv.imshow('gray',gray)7 dst = cv.equalizeHist(gray) #直方图均衡化,对比度增强8 cv.imshow('equalizehist',dst)9 cv.waitKey(0) 10 cv.destroyAllWindows()
2、自适应的局部的直方图均衡化createCLAHE
createCLAHE([, clipLimit[, tileGridSize]]) -> retval
clipLimit参数表示对比度的大小。
tileGridSize参数表示每次处理块的大小 。
1 img = cv.imread('1.jpg') #OpenCV直方图均衡化都是基于灰度图像 2 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) 3 cv.imshow('gray',gray) 4 clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8)) 5 dst = clahe.apply(gray) #将灰度图像和局部直方图相关联,把直方图均衡化应用到灰度图 这两行必须搭配起来使用才可以 6 cv.imshow('dis',dst) 7 cv.waitKey(0) 8 cv.destroyAllWindows()
五、直方图比较
1 def create_rag_hist(image):2 h,w,c = image.shape3 rgbHist = np.zeros([16*16*16,1],np.float32) #注意,np.array二维以上的,每个元素是一个数组4 bsize = 256/16 #间隔是165 for row in range(h):6 for col in range(w):7 b = image[row,col,0]8 g = image[row,col,1]9 r = image[row,col,2] 10 index = np.int(b/bsize)*16*16 + np.int(g/bsize)*16 + np.int(r/bsize) 11 rgbHist[np.int(index),0] = rgbHist[np.int(index),0] + 1 #二维的,所以是rgbhist[n,0]只不过每个数组只有一个元素,所以用0 12 return rgbHist 13 14 def hist_compare(image1,image2): 15 hist1 = create_rag_hist(image1) 16 hist2 = create_rag_hist(image2)##注意:compareHist里面的hist1和hist2必须是np.float32 17 match1 = cv.compareHist(hist1,hist2,cv.HISTCMP_BHATTACHARYYA) #巴氏距离比较,越小越相似 18 match2 = cv.compareHist(hist1,hist2,cv.HISTCMP_CORREL) #相关性比较(最大为1):越接近1越相似 19 match3 = cv.compareHist(hist1,hist2,cv.HISTCMP_CHISQR) #卡方比较,越小越相似 20 print("巴氏:%s 相关性:%s 卡方:%s"%(match1,match2,match3))
hist_compare(src,src) #当我们使用两张一样的图像比较
巴氏:0.0 相关性:1.0 卡方:0.0
六、直方图反向投影
1、直方图反向投影方法
2、二维直方图表示(就是x,y坐标有编辑)
(1)直接显示(不炫酷)
hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286]) #横坐标289个,范围是[0,289],纵坐标是286个,范围是[0,286] cv.imshow("hist2D",hist)
(2)、使用matplotlib
hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286]) plt.imshow(hist,interpolation="nearest") #插值方式,临近点差值,显示的会很漂亮 plt.title("2D Histogram") plt.show()
3、直方图反向映射
def back_projection_demo():sample = cv.imread("./s2.png")target = cv.imread("./b.png")roi_hsv = cv.cvtColor(sample,cv.COLOR_BGR2HSV)tar_hsv = cv.cvtColor(target,cv.COLOR_BGR2HSV)
cv.imshow(</span><span style="color: #800000">"</span><span style="color: #800000">sample</span><span style="color: #800000">"</span><span style="color: #000000">,sample)
cv.imshow(</span><span style="color: #800000">"</span><span style="color: #800000">target</span><span style="color: #800000">"</span><span style="color: #000000">,target)<span style="background-color: #ffff00">roihist </span></span><span style="background-color: #ffff00">= cv.calcHist([roi_hsv], [0, 1], None, [324, 356], [0, 324, 0, 356])</span> <span style="color: #008000">#</span><span style="color: #008000">加红部分越小,匹配越放松,匹配越全面,若是bsize值越大,则要求得越精细,越不易匹配,所以导致匹配出来的比较小</span>
<span style="background-color: #ffff00">cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX) </span> <span style="color: #008000">#</span><span style="color: #008000">规划到0-255之间</span>
<span style="background-color: #ffff00">dst = cv.calcBackProject([tar_hsv],[0,1],roihist,[0,324,0,356],1)</span> <span style="color: #008000">#</span><span style="color: #008000">直方图反向投影</span>
cv.imshow(<span style="color: #800000">"</span><span style="color: #800000">back_projection_demo</span><span style="color: #800000">"</span>,dst)</pre>
roihist = cv.calcHist([roi_hsv], [0, 1], None, [32, 32], [0, 324, 0, 356]) #这是两个通道,bsize变少了,但是他的匹配更加广了(对于匹配的局限放宽了),小的话,效果越好
normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]) -> dst
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
src参数表示输入数组。
dst参数表示输出与src相同大小的数组,支持原地运算。
alpha参数表示range normalization模式的最小值。
beta参数表示range normalization模式的最大值,不用于norm normalization(范数归一化)模式。
norm_type参数表示归一化的类型。
norm_type参数可以有以下的取值:
NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
NORM_INF:归一化数组的C-范数(绝对值的最大值)。
NORM_L1 :归一化数组的L1-范数(绝对值的和)。
NORM_L2 :归一化数组的(欧几里德)L2-范数。
calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst
函数cv2.calcBackProject用来计算直方图反向投影。
反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。
images参数表示输入图像(是HSV图像)。传入时应该用中括号[ ]括起来。目标图像
channels参数表示用于计算反向投影的通道列表,通道数必须与直方图维度相匹配。直方图维度
hist参数表示输入的模板图像直方图。sample直方图
ranges参数表示直方图中每个维度bin的取值范围 (即每个维度有多少个bin)。
scale参数表示可选输出反向投影的比例因子,一般取1(按照原样大小输出)。
OpenCV图像直方图案例相关推荐
- opencv——图像直方图与反向投影
引言 在图像处理中,对于直方图这个概念,肯定不会陌生.但是其原理真的可以信手拈来吗? 本文篇幅有点长,在此列个目录,大家可以跳着看: 分析图像直方图的概念,以及opencv函数calcHist()对于 ...
- OpenCV 图像直方图计算calcHist()
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/keith_bb/article/details/56680997 图像直方图是对数据集合的一种统计方 ...
- OpenCV笔记23:OpenCV图像直方图
那么什么是直方图? 直方图是条形图的变体,其中数据值组合在一起并放入不同的类中. 通过此分组,您可以查看每个类中数据在数据集中出现的频率. 1.学习目标 (1)使用OpenCV Python使用图像直 ...
- 【OpenCV应用】python处理行李图像匹配项目——图像直方图应用与明暗变换
OpenCV--图像直方图与明暗变换应用记录 图像直方图应用与明暗变换 简单伽马变换与直方图显示 MASK特定区域直方图显示 OPENCV: 直方图均衡化 有限对比度自适应直方图均衡 二维直方图 直方 ...
- OpenCV-Python图像直方图计算calcHist函数详解、示例及图形呈现
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在前面几篇直方图相关的文章中介绍了直方图均衡.直方图匹配.局部直方图处理.基 ...
- Python+OpenCV:直方图反向投影(Histogram Backprojection)
Python+OpenCV:直方图反向投影(Histogram Backprojection) Algorithm in Numpy 1. First we need to calculate the ...
- 使用Python,OpenCV计算图像直方图(cv2.calcHist)
使用Python,OpenCV计算图像直方图(cv2.calcHist 1. 效果图 2. 原理 2.1 什么是图像直方图? 2.2 计算直方图 2.3 可视化蒙版区域 3. 源码 参考 这篇博客将介 ...
- 【OpenCV 4开发详解】图像直方图绘制
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- opencv 直方图_OpenCV之图像直方图反向投影
python代码: import cv2 as cv import numpy as np from matplotlib import pyplot as pltdef back_projectio ...
- OpenCV与图像处理学习二——图像直方图与色彩空间
OpenCV与图像处理学习二--图像直方图与色彩空间 2.4 图像直方图(Image Histogram) 2.4.1 直方图的绘制 2.4.2 三通道直方图绘制 2.5 颜色空间 2.5.1 RGB ...
最新文章
- ALTER PROFILE DEFAULT LIMIT PASS_LIFE_TIME UNLIMITED
- 提高你的Java代码质量吧:让我们疑惑的字符串拼接方式的选择
- php float浮点型 用round方法比较
- php二进制流转bmp图片,php图片的二进制转换实例
- k8s安装部署步骤_30分钟无坑部署K8S单Master集群
- 归并排序的分析与Java实现
- jdk入门_JDK 9 REPL:入门
- 分治应用--万里挑一 找假硬币
- Matplotlib学习---用matplotlib画箱线图(boxplot)
- web开发 java如何连接数据库并取得数据,实现 增,删,改,查
- Spring Cloud 启动Eureka的Client(客户端)时,项目一启动就停止,控制台无任何报错信息
- 洛谷P1219 八皇后 题解
- keil添加华大芯片支持jflash下载
- Java中继承thread类与实现Runnable接口的区别(转)
- BZOJ 3351 ioi2009 Regions
- 【服务器管理】Ubuntu的一次惊心动魄的查杀挖矿病毒的经历:病毒伪装成python
- 微信公众号抓取研究----使用xposed程序hook
- ckeditor5 全屏功能
- pc模式 华为mate30_华为Mate30系列10个隐藏黑科技
- Ubuntu下的opencv:在图片上加汉字和数字