OpenCV常用基本处理函数(7)图像金字塔和直方图
高斯金字塔
高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图像中 5 个像素的高斯加权平均值。
这样操作一次一个 MxN 的图像就变成了一个 M/2xN/2 的图像。所以这幅图像的面积就变为原来图像面积的四分之一。
可以得到一个分辨率不断下降的图像金字塔。我们可以使用函数cv2.pyrDown() 和 cv2.pyrUp() 构建图像金字塔。
图像的轮廓:
轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同、的颜色或者灰度;
在一个二值图像中查找轮廓:
函数 cv2.findContours() 有三个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。返回值有三个,第一个是图像,第二个是轮廓,第三个是(轮廓的)层析结构。
直方图
直方图是根据灰度图像绘制的,而不是彩色图
使用 OpenCV 统计一幅图像的直方图
参数:
cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])
1. images: 原图像(图像格式为 uint8 或 float32)。当传入函数时应该用中括号 [] 括起来,例如:[img]。
2. channels: 同样需要用中括号括起来,它会告诉函数我们要统计那幅图像的直方图。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。
3. mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。(后边有例子)
4. histSize:BIN 的数目。也应该用中括号括起来,例如:[256]。
5. ranges: 像素值范围,通常为 [0,256]
也可以这样,Matplotlib Matplotlib 中有直方图绘制函数:matplotlib.pyplot.hist()
它可以直接统计并绘制直方图
可以只使用 matplotlib 的绘图功能,这在同时绘制多通道(BGR)的直方图
- import cv2
- import numpy as np
- from matplotlib import pyplot as plt
- img = cv2.imread('home.jpg')
- color = ('b','g','r')
- # 对一个列表或数组既要遍历索引又要遍历元素,使用enumerate
- for i,col in enumerate(color):
- histr = cv2.calcHist([img],[i],None,[],[,])
- plt.plot(histr,color = col)
- plt.xlim([,])
- plt.show()
直方图均衡化
一维直方图
直接得到的直方图可能某些像素值聚集在一个地方,一副高质量的图像的像素值分布应该很广泛。
所以你应该把它的直方图变成均衡分布,这就是直方图均衡化。通常情况下这种操作会改善图像的对比度。
这里直接介绍自适应的直方图均衡化的函数,可以有效的保留图像的某些细节部分;
这种情况下,整幅图像会被分成很多小块,这些小块被称为“tiles”(也就是函数的第二个参数默认是 8x8),然后再对每一个小块分别进行直方图均衡化
- import numpy as np
- import cv2
- img = cv2.imread('tsukuba_l.png',)
#创建一个clahe对象
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(,))- cl1 = clahe.apply(img)
- cv2.imwrite('clahe_2.jpg',cl1)
2D直方图
一维直方图只考虑灰度值这一因素,2d直方图要考虑颜色和饱和度两个因素;(hsv空间的前两个就是颜色和饱和度)
- 用cv2.calcHist()计算 2D 直方图,参数要修改:
• channels=[0 ,1] 同时处理 H 和 S 两个通道。
• bins=[180 ,256]H 通道为 180,S 通道为 256。
• range=[0 ,180 ,0 ,256]H 的取值范围在 0 到 180,S 的取值范围在 0 到 256。
最后一行是使用plt的画图函数画出彩色直方图,插值函数用nearest.
- img = cv2.imread('home.jpg')
- hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
- hist = cv2.calcHist([hsv], [, ], None, [, ], [, , , ])
- plt.imshow(hist,interpolation = 'nearest')
直方图反向投影
目的是在图像中找寻我们感兴趣的部分或者其他作用;
投影后会输出与输入图像(待搜索)同样大小的图像,其中的每一个像素值代表了输入图像上对应点属于目标对象的概率。、
用更简单的话来解释,输出图像中像素值越高(越白)的点就越可能代表我们要搜索的目标(在输入图像所在的位置)。
OpenCV 里使用函数 cv2.calcBackProject() 做直方图反向投影。它的参数与函数 cv2.calcHist 的参数基本相同。其中的一个参数是我们要查找目标的直方图。第三个参数是锁定目标的直方图
同样再使用目标的直方图做反向投影之前我们应该先对其做归一化处理。返回的结果是一个概率图像,我们再使用一个圆盘形卷积核对其做卷操作,最后使用阈值进行二值化
- import cv2
- import numpy as np
- roi = cv2.imread('tar.jpg')
- hsv = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
- target = cv2.imread('roi.jpg')
- hsvt = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)
- # calculating object histogram
- roihist = cv2.calcHist([hsv],[, ], None, [, ], [, , , ] )
- # normalize histogram and apply backprojection
- # 归一化:原始图像,结果图像,映射到结果图像中的最小值,最大值,归一化类型
- #cv2.NORM_MINMAX 对数组的所有值进行转化,使它们线性映射到最小值和最大值之间
- # 归一化之后的直方图便于显示,归一化之后就成了 到 之间的数了。
- cv2.normalize(roihist,roihist,,,cv2.NORM_MINMAX)
- dst = cv2.calcBackProject([hsvt],[,],roihist,[,,,],)
- # Now convolute with circular disc
- # 此处卷积可以把分散的点连在一起
- disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(,))
- dst=cv2.filter2D(dst,-,disc)
- # threshold and binary AND
- ret,thresh = cv2.threshold(dst,,,)
- # 别忘了是三通道图像,因此这里使用 merge 变成 通道
- thresh = cv2.merge((thresh,thresh,thresh))
- # 按位操作
- res = cv2.bitwise_and(target,thresh)
- res = np.hstack((target,thresh,res))
- cv2.imwrite('res.jpg',res)
- # 显示图像
- cv2.imshow('',res)
- cv2.waitKey()
结果如图所示:
参考自:https://www.cnblogs.com/Undo-self-blog/p/8439149.html
OpenCV常用基本处理函数(7)图像金字塔和直方图的更多相关文章
- OpenCV学习笔记(七) 图像金字塔 阈值 边界
转自: OpenCV 教程 使用 图像金字塔 进行缩放 图像金字塔是视觉运用中广泛采用的一项技术.一个图像金字塔是一系列图像的集合 - 所有图像来源于同一张原始图像 - 通过梯次向下采样获得,直到达到 ...
- OpenCV常用数据结构和函数
点的表示:Point类 Point类数据结构表示二维坐标系下的点,即由其图像坐标x,y指定的2D点. 用法如下 Point point; point.x = 10; point.y = 8; 或者 P ...
- opencv —— resize、pyrUp 和 pyrDown 图像金字塔(高斯金字塔、拉普拉斯金字塔)与尺寸缩放(向上采样、向下采样)
我们经常会将某种尺寸的图像转化为其他尺寸的图像,如果需要放大或者缩小图像的尺寸,在 OpenCV 中可以使用如下两种方法: resize 函数,最直接的方法. pyrUp 和 pyrDown 函数,即 ...
- Opencv笔记(十五)——图像金字塔
参考文献 目标 学习图像金字塔 学习函数cv2.pyrUp()和cv2.pyrDown() 原理 当我们需要将图像转换到另一个尺寸的时候, 有两种可能,一种是放大图像,另一种是缩小图像.尽管在Open ...
- OpenCV计算机视觉学习(7)——图像金字塔(高斯金字塔,拉普拉斯金字塔)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本节 ...
- OpenCV常用基本处理函数(6)图像梯度
形态学转换 腐蚀 img = cv2.imread() kernel = np.ones((,),np.uint8) erosion = cv2.erode(img,kernel,iterations ...
- OpenCV常用基本处理函数(2)图像基本操作
可以根据像素的行和列的坐标获取他的像素值.对 BGR 图像而言,返回值为 B,G,R 例如获取蓝色的像素值: img=cv2.imread('messi5.jpg')px=img[100,100]bl ...
- OpenCV常用基本处理函数(8)图像变换
傅里叶变换 傅里叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅里叶变换就表示f的频谱. 图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度.如:大面积的沙 ...
- OpenCV常用基本处理函数(5)图像模糊
2D卷积操作 cv.filter2D() 可以让我们对一幅图像进行卷积操作, 图像模糊(图像平滑)使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音 ...
随机推荐
- CF1111C Creative Snap 线段树
用线段树模拟一下就好了~ code: #include <cstdio> #include <algorithm> #define lson ls[x] #define rso ...
- Angular JS - 5 - Angular JS 模块和控制器
1.引入 1.5版本的angularjs,直接打印angular对象: --> <!DOCTYPE html> <html> <head lang="en ...
- 【Flutter学习】之button按钮
一,概述 由于Flutter是跨平台的,所以有适用于Android和iOS的两种风格的组件.一套是Google极力推崇的Material,一套是iOS的Cupertino风格的组件.无论哪种风格,都是 ...
- delphi WaitForSingleObject 示例之一等待另一个进程的结束
<pre>unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Cont ...
- Docker(应用服务引擎)
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- 汇编 “ program has no starting address ”解决方法
- 微信网页开发调用微信jssdk接口遇到的坑以及最终解决方法 (持续更新)
1.微信网页开发调用jssdk时报permission denied 大致是两个原因 (1)首先注册时未将你所调用的接口名字添加至jsApiList (2)第二个就是你的这个公众号没有权限使用这个ap ...
- Dealing with exceptions thrown in Application_Start()
https://blog.richardszalay.com/2007/03/08/dealing-with-exceptions-thrown-in-application_start/ One a ...
- Hive if和coalesce函数
链接:https://blog.csdn.net/qq_26442553/article/details/79465417 if 函数举例:
- mysql linux下安装部署
一.安装简介 用户名:mysql安装目录:/usr/local/mysql-5.5数据库目录:/data/mysql/data源码包:mysql-5.5.28.tar.gz 二.安装准备 a.vi / ...