OpenCV(python)一键入门--第五篇(图像直方图反向投影)

举报
拓佑豪 发表于 2021/07/19 23:04:29 2021/07/19
【摘要】 主要介绍图像直方图反向投影

关于图像直方图反向投影,先展示一段代码

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

def hist2d_demo(image):
    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
    hist = cv.calcHist([hsv], [0, 1], None, [32, 32], [0, 180, 0, 256])
    dst = cv.resize(hist, (400, 400))
    cv.imshow("image", image)
    cv.imshow("hist", dst)
    plt.imshow(hist, interpolation='nearest')
    plt.title("2D Histogram")
    plt.show()
    
sample = cv.imread("D:/a1.jpg")
hist2d_demo(sample)
target = cv.imread("D:/a2.jpg")
hist2d_demo(target)
roi_hsv = cv.cvtColor(sample, cv.COLOR_BGR2HSV)
target_hsv = cv.cvtColor(target, cv.COLOR_BGR2HSV)

roiHist = cv.calcHist([roi_hsv], [0, 1], None, [32, 32], [0, 180, 0, 256])
cv.normalize(roiHist, roiHist, 0, 255, cv.NORM_MINMAX)
dst = cv.calcBackProject([target_hsv], [0, 1], roiHist, [0, 180, 0, 256], 1)
cv.imshow("Demo", dst)

cv.waitKey(0)
cv.destroyAllWindows()

1:cv.calcHist。有5个参数

hist = cv.calcHist([hsv], [0, 1], None, [32, 32], [0, 180, 0, 256])

· image:输入图像,传入时应该用中括号[ ]括起来
· channels:传入图像的通道,如果是灰度图像,那就只有一个通道,其值为0。如果是彩色图像,那就需要在其中选择一个,那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也要用中括号[ ]传入。
· mask:掩膜图像。如果统计整幅图,那么为None。主要是如果要统计部分图的直方图,就得构造相应的掩膜来计算。
· histSize:灰度级的个数,需要中括号,比如[256]
· ranges:像素值的范围,通常[0,256],有的图像如果不是0-256,比如说你来回各种变换导致像素值负值、很大,则需要调整

2:resize。图像放缩

函数原型:cv.resize( InputArray src, OutputArray dst, Size, fx, fy, interpolation)InputArray src:输入图片
OutputArray dst :输出图片
Size:输出图片尺寸
fx, fy:沿x轴,y轴的缩放系数
interpolation   :插入方式

demo中的代码为:dst = cv.resize(hist, (400, 400)),即把放缩后的图像赋值给dst

3:matplotlib

这里使用到matplotlib的pyplot来展示图像

· plt需要先imshow一张图,然后调整参数,最后show语句再展示图片。

demo中的代码:plt.imshow(hist, interpolation='nearest')

关于interpolation,下面是官网介绍的翻译:

如果内插(interpolation)为None,默认为rcParams["image.interpolation"](默认:“反别名”)。如果插值是'none',然后不对Agg,PS和pdf后端执行插值。其他后端默认为'antialiased'.

对于Agg,PS和pdf后端,interpolation = 'none'缩小大图像时工作正常,而interpolation = 'nearest'当一个小图像被放大时,效果很好。

看见图像抗混叠对于默认情况的讨论interpolation="antialiased"选择。

(参考网址:interpolation_methods

参考如上效果图调整所需参数即可

4:cv.normalize

我的第3篇有描述,如果想了解,可以前往OpenCV(python)——一键入门--第3篇(归一化和视频操作入门)查看归一化的具体内容

5:反向投影calcBackProject

找到一个有意思的解释,希望可以方便大家理解反向投影

“举个栗子,给大家介绍反向投影:

        想必大家都玩过一个游戏,(没玩过的可以体验一下),一个人蒙住眼睛,其余的人在指定区域内活动,蒙眼睛的人依靠声音等方式去寻找其余的人。设蒙眼睛的人为A,其余人中有个人是B。

        假如这个人只能通过声音去寻找,那这个人其实是通过“双耳效应”,简化一下,就是说当B发出声音的时候,A听到B的声音,根据自己感知到声音传到两个耳朵的不同,顺着声音的方向,做两条反向延长线,两条线交于一个点,这个点的位置,就是B所在的位置。

        同样原理的还有测量地震的设备,很多时候,测震源有两个设备,设备对地震源做反向投影,就会找到地震的中心。



原文链接:https://blog.csdn.net/shuiyixin/article/details/80331839  ”

函数原型:dst = cv.calcBackProject(images, channels, hist, ranges, scale[, dst])

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

6:补充,直方图均衡化

将图像转为灰度,即可进行图像的直方图均衡化

roi_gray = cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
dstt = cv.equalizeHist(roi_gray)
cv.imshow("equalizeHist_img",dstt)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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