OpenCV(python)一键入门--第五篇(图像直方图反向投影)
关于图像直方图反向投影,先展示一段代码
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)
- 点赞
- 收藏
- 关注作者
评论(0)