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

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

基础知识铺垫

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

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

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

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

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

cv2.calcBackProject 函数

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

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

函数原型说明

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

参数说明如下:

  • 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()

先看一下运行效果。

不过这个效果实在不是很理想,为了获取到更精确的值,我增加了一个滑动条。

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

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 个小时,你有所收获,我们下篇博客见~

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


博主 ID:梦想橡皮擦,希望大家点赞评论收藏

免责声明:务必仔细阅读

  • 本站为个人博客,博客所转载的一切破解、path、补丁、注册机和注册信息及软件等资源文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。

  • 本站为非盈利性站点,打赏作为用户喜欢本站捐赠打赏功能,本站不贩卖软件等资源,所有内容不作为商业行为。

  • 本博客的文章中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断.

  • 本博客的任何内容,未经许可禁止任何公众号、自媒体进行任何形式的转载、发布。

  • 博客对任何脚本资源教程问题概不负责,包括但不限于由任何脚本资源教程错误导致的任何损失或损害.

  • 间接使用相关资源或者参照文章的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 博客对于由此引起的任何隐私泄漏或其他后果概不负责.

  • 请勿将博客的任何内容用于商业或非法目的,否则后果自负.

  • 如果任何单位或个人认为该博客的任何内容可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明至admin@proyy.com.我们将在收到认证文件后删除相关内容.

  • 任何以任何方式查看此博客的任何内容的人或直接或间接使用该博客的任何内容的使用者都应仔细阅读此声明。博客保留随时更改或补充此免责声明的权利。一旦使用并复制了博客的任何内容,则视为您已接受此免责声明.

您必须在下载后的24小时内从计算机或手机中完全删除以上内容.

您使用或者复制了本博客的任何内容,则视为已接受此声明,请仔细阅读


更多福利请关注一一网络微信公众号或者小程序

一一网络微信公众号
打个小广告,宝塔服务器面板,我用的也是,很方便,重点是免费的也能用,没钱太难了,穷鬼一个,一键全能部署及管理,送你3188元礼包,点我领取https://www.bt.cn/?invite_code=MV9kY3ZwbXo=


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

发表评论

发表评论

一一网络-提供最优质的文章集合

立即查看 了解详情