文章目录

  • 一、直方图
    • 1.画直方图
    • 2.mask的使用
    • 3.直方图均值化
    • 4.自适应直方图均衡化
  • 二、模板匹配
    • 1.匹配单个对象
    • 2.匹配多个对象

一、直方图

直方图是像素点数值分布的统计图形表示,也就是每个点出现的个数,它让我们能够理解数据的密度估计和概率分布。

cv2.calcHist(images,channels,mask,histSize,ranges)

images: 原图像图像格式为 uint8 或 float32。当传入函数时需要用中括号 [] 括来例如[img]
channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果输入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
mask: 掩模图像。统计整幅图像的直方图就把它为 None。但是如 果你想统计图像某一分的直方图的你就制作一个掩模图像并 使用它。
histSize:BIN 的数目。也应用中括号括来,比如[256]
ranges: 像素值范围常为 [0-256]

1.画直方图

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()
img = cv2.imread('D:/cat2.jpg',0) #0表示灰度图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
plt.hist(img.ravel(),256);
plt.show()

效果:

2.mask的使用

用mask对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
使用mask:

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()
img = cv2.imread('D:/cat2.jpg',0) #0表示灰度图
# 创建mast
mask = np.zeros(img.shape[:2], np.uint8)
print (mask.shape)
mask[100:200, 100:300] = 255#mask[起始点横坐标,起始点纵坐标]=255,255为白色,也就是需要保留的地方
masked_img = cv2.bitwise_and(img, img,mask=mask)#与操作
res=res = np.hstack((img,masked_img))#t图像拼接
cv_show(res,'res')

其中cv2.bitwise_and的参数
img:第一张输入图片
img: 第二张输入图片
mask:掩码图像
因为cv2.bitwise_and需要有两个输入图像,所以我们两个都是img
效果:

3.直方图均值化

直方图均衡化是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。直方图均衡化方法的基本思想是对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。从而达到清晰图像的目的。

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()
img = cv2.imread('D:/cat2.jpg',0) #0表示灰度图
equ = cv2.equalizeHist(img)
res = np.hstack((img,equ))
cv_show(res,'res')

效果:

4.自适应直方图均衡化

自适应直方图均衡化(用来提升图像的对比度的一种计算机图像处理技术。和普通的直方图均衡不同,AHE算法通过计算图像的局部直方图,然后重新分布亮度来改变图像对比度。因此,该算法更适合于改进图像的局部对比度以及获得更多的图像细节。
由于图片明暗分布的问题,对一张图片进行全局的直方图均衡化可能导致明部或者暗部的细节丢失。为了优化均衡化效果,我们对可以对不同区域进行直方图均衡化以获得更加合适的效果。

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()
img = cv2.imread('D:/cat2.jpg',0) #0表示灰度图
equ = cv2.equalizeHist(img)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
res_clahe = clahe.apply(img)
res = np.hstack((img,res_clahe,equ))
cv_show(res,'res')

cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))其中clipLimit颜色对比度的阈值,titleGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作。
效果:

图二为自适应直方图均衡化后的图像,可以发现比图三保留了更多的细节。

二、模板匹配

1.匹配单个对象

模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在opencv里有6种,然后将每次计算的结果放入一个矩阵里,作为结果输出。假如原图形是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)。模板匹配有六种方法,分别是:
TM_SQDIFF:计算平方不同,计算出来的值越小,越相关,公式为:
[R(x,y)= \sum _{x’,y’} (T(x’,y’)-I(x+x’,y+y’))^2]

TM_CCORR:计算相关性,计算出来的值越大,越相关,公式为:[R(x,y)= \sum _{x’,y’} (T(x’,y’) \cdot I(x+x’,y+y’))]

TM_CCOEFF:计算相关系数,计算出来的值越大,越相关,公式为:
[R(x,y)= \sum _{x’,y’} (T’(x’,y’) \cdot I’(x+x’,y+y’))]
where
[\begin{array}{l} T’(x’,y’)=T(x’,y’) - 1/(w \cdot h) \cdot \sum _{x’‘,y’‘} T(x’‘,y’‘) \ I’(x+x’,y+y’)=I(x+x’,y+y’) - 1/(w \cdot h) \cdot \sum _{x’‘,y’‘} I(x+x’‘,y+y’') \end{array}]

TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关,公式为:[R(x,y)= \frac{\sum_{x’,y’} (T(x’,y’)-I(x+x’,y+y’))2}{\sqrt{\sum_{x’,y’}T(x’,y’)2 \cdot \sum_{x’,y’} I(x+x’,y+y’)^2}}]

TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关,公式为:[R(x,y)= \frac{\sum_{x’,y’} (T(x’,y’) \cdot I(x+x’,y+y’))}{\sqrt{\sum_{x’,y’}T(x’,y’)^2 \cdot \sum_{x’,y’} I(x+x’,y+y’)^2}}]

TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关,公式为:[R(x,y)= \frac{ \sum_{x’,y’} (T’(x’,y’) \cdot I’(x+x’,y+y’)) }{ \sqrt{\sum_{x’,y’}T’(x’,y’)^2 \cdot \sum_{x’,y’} I’(x+x’,y+y’)^2} }]

代码:

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()
img = cv2.imread('D:/renxiang.jpg') #0表示灰度图
img2=img[20:150,150:300]#截取人脸
img3 = img.copy()
h, w = img2.shape[:2]#人脸的长和高
res = cv2.matchTemplate(img, img2, cv2.TM_SQDIFF_NORMED)
# 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)#min_val最小值,max_val最大值,min_loc最小值坐标,max_loc最大值坐标
#起始点
top_left = min_loc
#终止点
bottom_right = (top_left[0] + w, top_left[1] + h)
#画框
cv2.rectangle(img3, top_left, bottom_right, (0,0,255), 2)
cv_show(img3,'img')

效果:

2.匹配多个对象

模板匹配匹配多个对象,相当与设置一个阈值,大于这个阈值我们就认为它是匹配的.
代码:

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGBdef cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()img = cv2.imread('D:/eryu.jpg') #0表示灰度图
img2 = img[60:200,50:180]#截取图像
img3 = img.copy()
h, w = img2.shape[:2]#截取图像的长宽
#计算归一化相关系数,计算出来的值越接近1,越相关
res = cv2.matchTemplate(img, img2, cv2.TM_CCOEFF_NORMED)
#设置阈值为0.8
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):  # *号表示可选参数bottom_right = (pt[0] + w, pt[1] + h)cv2.rectangle(img3, pt, bottom_right, (0, 0, 255), 1)
cv_show(img3,'img')

效果:

Opencv学习笔记——直方图与模板匹配相关推荐

  1. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...

  2. OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()

    OpenCV学习(二十三) :模板匹配:matchTemplate() 1.概述 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配 ...

  3. opencv进阶学习笔记8:模板匹配

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 模板匹配原理 模板匹配(Te ...

  4. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  5. OpenCV学习笔记(十六):直方图均衡化:equalizeHist()

    OpenCV学习笔记(十六):直方图均匀化:equalizeHist() 参考博客: 直方图均衡化的数学原理 直方图匹配的数学原理 直方图均衡化广泛应用于图像增强中: 直方图均衡化处理的"中 ...

  6. python做直方图-python OpenCV学习笔记实现二维直方图

    本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...

  7. opencv学习笔记21:直方图和掩膜 原理及其应用

    直方图概念 如图:下面黑色图为上面图的直方图 横坐标:图像中各个像素点的灰度级 纵坐标:具有该灰度级的像素个数. 归一化直方图 横坐标:图像中各个像素点的灰度级 纵坐标:出现该灰度级的概率. DIMS ...

  8. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  9. python opencv 直方图均衡_详解python OpenCV学习笔记之直方图均衡化

    本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_hi ...

最新文章

  1. 不吹不黑!让你搜遍GitHub都找不到这么吊炸天的网约车项目!
  2. Ngnix负载均衡安装及配置
  3. dokuwiki 的管理和使用
  4. 避免Ie下的js缓存问题
  5. pythonATM,购物车项目实战_补充1-结构图
  6. oracle srvctl命令,关闭RAC、srvctl命令
  7. python hello world程序编写_自动编写Python程序的神器,Python 之父都发声力挺
  8. 【STM32】 色环电阻
  9. Network Mapper 嗅探工具
  10. C++ gflags示例
  11. Unity 2d - 基础 - 碰撞(一) - 针对性碰撞
  12. dataset中shuffle()、repeat()、batch()用法
  13. Png文件可横向拉伸html布局,png透明格式 以cad2010操作为例:
  14. 正负数排列(用链表和数组实现)
  15. 单、多分支结构的应用(有点复杂)
  16. 软件测试技术(五)软件测试流程
  17. 发现一个好办法-有问题可以到UNITY论坛搜索
  18. owin 怎么部署在云中_从几乎未能在云中部署简单的机器学习模型中学到的教训...
  19. iphone13哪个颜色好看
  20. Pandas数据分析库

热门文章

  1. 使用R语言绘制地图,图审号地图:2019年中国地图-审图号GS(2019)1822号为基础制作的矢量shp 地图数据
  2. 机器学习基石第四讲:feasibility of learning
  3. 浅析 CSS 新增的样式分层能力
  4. 初遇漂流瓶 v1.6
  5. (三)利用ffmpeg实现简单的MP4推流
  6. 找不到网络路径计算机共享,网络共享过失提示:找不到网络路径
  7. 文件路径模块pathlib
  8. 为战疫助力,半导体功不可没
  9. imagemagick图片识别技术数据抓取(转自:http://michael-roshen.iteye.com/blog/1982817)
  10. LBS与AGPS的区别