图像直方图反向投影,Python OpenCV 取经之旅第 28 天

举报
梦想橡皮擦 发表于 2021/03/26 00:09:42 2021/03/26
【摘要】 Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。 Python OpenCV 基础知识铺垫cv2.calcBackProject 函数函数原型说明 橡皮擦的小节 基础知识铺垫 通过直方图的反向投影,可以在图像 A 中查找特定的图像 B,一般情况下图像 A 比较大,图像 B 比较小或者图像 B 只有 1 个像素。...

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。

基础知识铺垫

通过直方图的反向投影,可以在图像 A 中查找特定的图像 B,一般情况下图像 A 比较大,图像 B 比较小或者图像 B 只有 1 个像素。

可以查找到最匹配的区域图像或者像素点。

翻译的理论一些就是,定位模板图像在输入图像中的位置。

在翻译成白话,就是计算图像为某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。

如果深究下去,图像的反向投影涉及的数学知识点也非常多,不过,取经之旅初期,咱们不深究这些内容。

cv2.calcBackProject 函数

在 Python OpenCV 中提供了一个用于实现反向投影的函数 cv2.calcBackProject

下面我们具体学习一下该函数如何使用。

函数原型说明

dst = cv2.calcBackProject(images, channels, hist, ranges, scale[, dst])

  
 
  • 1

参数说明如下:

  • images :输入图像,注意加 []
  • channels:通道,通道数必须与直方图维度相匹配,
  • hist:图象的直方图;
  • ranges:直方图的变化范围;
  • scale:输出反投影的可选比例因子。

案例 Demo 如下:

import cv2 as cv
from matplotlib import pyplot as plt

def back_projection_demo(): # 读取图片 test = cv.imread("test1.jpg") target = cv.imread("target.jpeg") # 转换为 HSV 格式 roi_hsv = cv.cvtColor(test, cv.COLOR_BGR2HSV) target_hsv = cv.cvtColor(target, cv.COLOR_BGR2HSV) cv.imshow("sample", test) cv.imshow("target", target) # 计算直方图 roiHist = cv.calcHist([roi_hsv], [0, 1], None, [64, 64], [0, 180, 0, 256]) # 获取直方图的反向投影 dst = cv.calcBackProject([target_hsv], [0, 1], roiHist, [0, 180, 0, 256], 1) cv.imshow("back_projection_demo", dst)

back_projection_demo()
cv.waitKey(0)

cv.destroyAllWindows()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

先看一下运行效果。
图像直方图反向投影,Python OpenCV 取经之旅第 26 天
不过这个效果实在不是很理想,为了获取到更精确的值,我增加了一个滑动条。

修改代码成如下这个样子。

import cv2 as cv
from matplotlib import pyplot as plt

winName = 'getTrackbarPos'
# 新建窗口
cv.namedWindow(winName, cv.WINDOW_NORMAL)

def nothing(): pass

cv.createTrackbar('hue', winName, 60, 180, nothing)
cv.createTrackbar('sat', winName, 60, 256, nothing)

def back_projection_demo(): # 读取图片 test = cv.imread("test1.jpg") # 转换为 HSV 格式 roi_hsv = cv.cvtColor(test, cv.COLOR_BGR2HSV) target = cv.imread("target.jpeg") target_hsv = cv.cvtColor(target, cv.COLOR_BGR2HSV) cv.imshow("sample", test) cv.imshow("target", target) while(1): # 从滑动条读取数据 hue = cv.getTrackbarPos('hue', winName) sat = cv.getTrackbarPos('sat', winName) # 计算直方图 roiHist = cv.calcHist([roi_hsv], [0, 1], None, [ hue, sat], [0, 180, 0, 256]) # 获取直方图的反向投影 dst = cv.calcBackProject([target_hsv], [0, 1], roiHist, [0, 180, 0, 256], 1) cv.imshow(winName, dst) if cv.waitKey(1) == ord('q'): break

back_projection_demo()
cv.destroyAllWindows()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

图像直方图反向投影,Python OpenCV 取经之旅第 26 天
反复调整之后,发现直方图反向投影,除了给橡皮擦增加一个函数认知外,并没有产生过多的思考,可能学习的还不够深入,总之把这个函数收入脑中,日后再次出现的时候,我们拿出来在品味一下。

补充一下官方说明地址:点击查阅

橡皮擦的小节

希望今天的 1 个小时,你有所收获,我们下篇博客见~

相关阅读


  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 69 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏

文章来源: blog.csdn.net,作者:梦想橡皮擦,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/hihell/article/details/113406002

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。