python实现直方图的应用
目录:
(一)调节图片对比度(均衡化)
(1)全局直方图均衡化------equalizeHist
(2)自适应的局部的直方图均衡化------createCLAHE
(二)图片的相似度比较
(三)直方图反向投影(实现对有颜色物体的跟踪)
(1)原理
(2)二维直方图的表示
A.直接显示
B.使用matplotlib
(3)直方图反向映射
A. def calcHist函数
B.roihist函数
C.归一化函数normalize详解
正文:
(一)调节图片对比度(均衡化)
(1)全局直方图均衡化------equalizeHist
1.直方图均衡化:如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。 它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。
2.全局直方图均衡化可能得到是一种全局意义上的均衡化,但是有的时候这种操作并不是很好,会把某些不该调整的部分给调整了。 Opencv中还有一种直方图均衡化,它是一种局部直方图均衡化,也就是是说把整个图像分成许多小块(比如按10*10作为一个小块),那么对每个小块进行均衡化。
3.cv2.equalizeHist函数原型:equalizeHist(src[, dst]) -> dst。函数equalizeHist的作用:直方图均衡化,提高图像质量。
1 def equalHist_demo(image): #OpenCV直方图均衡化都是基于灰度图像
2 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3 dst = cv.equalizeHist(gray) #直方图均衡化,对比度增强
4 cv.imshow("equalHist_demo",dst)

缺点:对比度太明显了!
(2)自适应的局部的直方图均衡化------createCLAHE
1.createCLAHE函数原型:createCLAHE([, clipLimit[, tileGridSize]]) -> retval clipLimit参数表示对比度的大小。 tileGridSize参数表示每次处理块的大小 。
1 def clahe_demo(image): #OpenCV直方图均衡化都是基于灰度图像
2 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3 clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
4 dst = clahe.apply(gray) #将灰度图像和局部直方图相关联
5 cv.imshow("clahe_demo",dst)

(二)图片的相似度比较
1 def create_rag_hist(image):
2 h,w,c = image.shape
3 rgbHist = np.zeros([16*16*16,1],np.float32)
4 bsize = 256/16 #间隔是16
5 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
12 return rgbHist
13
14 def hist_compare(image1,image2):
15 hist1 = create_rag_hist(image1)
16 hist2 = create_rag_hist(image2)
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))

(三)直方图反向投影(实现对有颜色物体的跟踪)
(1)原理

(2)二维直方图的表示
A.直接显示

1 def hist2D_demo(image):
2 hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
3 hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286])
4 cv.imshow("hist2D",hist)

B.使用matplotlib
1 def hist2D_demo(image):
2 hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
3 hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286])
4 plt.imshow(hist,interpolation="nearest")
5 plt.title("2D Histogram")
6 plt.show()

(3)直方图反向映射
A. def calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None): # real signature unknown; restored from __doc__
images:输入图像
channels:需要统计直方图的第几通道
mask:掩膜,,计算掩膜内的直方图 ...Mat()
histSize:指的是直方图分成多少个区间,就是 bin的个数
ranges: 统计像素值得区间
hist:输出的直方图数组
accumulate=false:在多个图像时,是否累计计算像素值得个数
1 def back_projection_demo():
2 sample = cv.imread("./s2.png")
3 target = cv.imread("./b.png")
4 roi_hsv = cv.cvtColor(sample,cv.COLOR_BGR2HSV)
5 tar_hsv = cv.cvtColor(target,cv.COLOR_BGR2HSV)
6
7 cv.imshow("sample",sample)
8 cv.imshow("target",target)
9
10 roihist = cv.calcHist([roi_hsv], [0, 1], None, [324, 356], [0, 324, 0, 356]) #加红部分越小,匹配越放松,匹配越全面,若是bsize值越大,则要求得越精细,越不易匹配,所以导致匹配出来的比较小
11 cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX) #规划到0-255之间
12 dst = cv.calcBackProject([tar_hsv],[0,1],roihist,[0,324,0,356],1) #直方图反向投影
13 cv.imshow("back_projection_demo",dst)

B.roihist = cv.calcHist([roi_hsv], [0, 1], None, [32, 46], [0, 324, 0, 356]) #这是两个通道,bsize变少了,但是他的匹配更加广了(对于匹配的局限放宽了)

C.归一化函数normalize详解
1. 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。 归一化函数cv2.normalize原型: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-范数。
2.反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。 函数cv2.calcBackProject用来计算直方图反向投影。 函数原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst images参数表示输入图像(是HSV图像)。传入时应该用中括号[ ]括起来。 channels参数表示用于计算反向投影的通道列表,通道数必须与直方图维度相匹配。 hist参数表示输入的模板图像直方图。 ranges参数表示直方图中每个维度bin的取值范围 (即每个维度有多少个bin)。 scale参数表示可选输出反向投影的比例因子,一般取1。
参考:
https://www.cnblogs.com/ssyfj/p/9270608.html
https://www.cnblogs.com/ssyfj/p/9271327.html
python实现直方图的应用的更多相关文章
- python用直方图规定化实现图像风格转换
以下内容需要直方图均衡化.规定化知识 均衡化:https://blog.csdn.net/macunshi/article/details/79815870 规定化:https://blog.csdn ...
- python实现直方图均衡化,理想高通滤波与高斯低通滤波
写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...
- python入门-直方图
使用的是pygal函数库 所以需要先安装 1 安装库文件 pip install pygal=1.7 2 创建骰子类 from random import randint class Die(): # ...
- 8、OpenCV Python 图像直方图
__author__ = "WSX" import cv2 as cv import numpy as np from matplotlib import pyplot as pl ...
- python 画直方图
import numpy as npimport matplotlib.pyplot as plt def sample_data(size,length=100): data=[] for i in ...
- Python绘制直方图 Pygal模拟掷骰子
#coding=utf-8 from random import randint class Die(): """骰子类""" def __ ...
- Python 画 直方图/条形图/柱状图
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u011489887/article/de ...
- Python爱好者社区历史文章列表(每周append更新一次)
2月22日更新: 0.Python从零开始系列连载: Python从零开始系列连载(1)——安装环境 Python从零开始系列连载(2)——jupyter的常用操作 Python从零开始系列连载( ...
- python爬取拉勾网数据并进行数据可视化
爬取拉勾网关于python职位相关的数据信息,并将爬取的数据已csv各式存入文件,然后对csv文件相关字段的数据进行清洗,并对数据可视化展示,包括柱状图展示.直方图展示.词云展示等并根据可视化的数据做 ...
随机推荐
- JVM学习笔记——堆
堆 Heap 一个 JVM 只有一个堆,堆也是 Java 内存管理的核心区域.在 JVM 启动时堆被创建,同时大小在启动时已设定好,堆是 JVM 管理最大的一块内存空间,其大小可以调节. 堆的内存空间 ...
- python日志配置及调用
0.日志基础操作 import logging logging.basicConfig( #1.日志输出的位置,终端和文件 filename='access.log', #,不指定默认打到终端上 #2 ...
- Dapr + .NET Core实战(十三)跨语言开发
因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...
- 2020.11.14-pta天梯练习赛补题
7-7 矩阵A乘以B 给定两个矩阵A和B,要求你计算它们的乘积矩阵AB.需要注意的是,只有规模匹配的矩阵才可以相乘.即若A有Ra行.Ca列,B有Rb行.Cb列,则只有Ca ...
- TCC分布式事务的实现原理
目录 一.写在前面 二.业务场景介绍 三.进一步思考 四.落地实现TCC分布式事务 (1)TCC实现阶段一:Try (2)TCC实现阶段二:Confirm (3)TCC实现阶段三:Cancel 五.总 ...
- Serverless Kubernetes 和 Serverless on Kubernetes 的区别
什么是 Kubernetes? Kubernetes 是一个可移植的.可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化. 什么是 Serverless ? 无服务器是一种云原 ...
- 【UE4 C++】定时器 Timer 与事件绑定
概念 定时执行操作,可执行一次,或循环执行直到手动终止 定时器在全局定时器管理器(FTimerManager 类型)中管理.全局定时器管理器存在于 游戏实例 对象上以及每个 场景 中 定时器需要绑定委 ...
- 预备知识-python核心用法常用数据分析库(上)
1.预备知识-python核心用法常用数据分析库(上) 目录 1.预备知识-python核心用法常用数据分析库(上) 概述 实验环境 任务一:环境安装与配置 [实验目标] [实验步骤] 任务二:Pan ...
- Linux入门必须养成的七大习惯
对于很多Linux初学者来说,在刚开始使用linux系统时会感到很多的不适.这里为大家整理了自己以前linux入门时别人告诉我的七个习惯.我相信如果你运用了这七个习惯,在你使用Linux时你会感觉更安 ...
- 写一段java程序来执行linux命令
摘要 在日常开发中,程序员需要经常查询服务器日志来排查问题和调试程序.如果是本地调试还好,但项目一旦发布到服务器上,每次查日志就很麻烦,而且日志量巨大,有时我们无法找到我们需要的信息.经常需要借助第三 ...