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


Posted in Python onFebruary 07, 2018

本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下:

官方文档 ? https://docs.opencv.org/3.4.0/dc/df6/tutorial_py_histogram_backprojection.html

它用于图像分割或寻找图像中感兴趣的对象。简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每个像素对应于属于我们对象的像素的概率。输出图像将使我们感兴趣的对象比其余部分更白。

该怎么做呢?我们创建一个图像的直方图,其中包含我们感兴趣的对象。为了得到更好的结果,对象应该尽可能地填充图像。而颜色直方图比灰度直方图更受青睐,因为对象的颜色比灰度强度更能定义对象。然后,我们在我们的测试图像上“反向投射”这个直方图,我们需要找到这个对象,换句话说,我们计算每个像素的概率,并显示它。在适当的阈值上产生的输出结果使我们得到了一个单独的结果。

Numpy中的算法

1、首先,我们需要计算我们需要找到的对象的颜色直方图(让它为'M')和我们将要搜索的图像(让它为'I')。

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

# roi是我们需要找到的对象或区域
roi = cv.imread('rose_red.png')
hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)

# target是我们搜索的图像
target = cv.imread('rose.png')
hsvt = cv.cvtColor(target, cv.COLOR_BGR2HSV)

# 用calcHist来找直方图,也可以用np.histogram2d
M = cv.calcHist([hsv], [0,1], None, [180,256], [0,180,0,256])
I = cv.calcHist([hsvt], [0,1], None, [180,256], [0,180,0,256])

2、找到比率 R=M/I。然后背面投射R ,使用R作为调色板,并创建一个新的图像,每个像素作为其对应的目标概率。B(x,y) = R[h(x,y),s(x,y)],其中h是(x,y)坐标像素的色调,s是饱和度。之后,B(x,y)=min[B(x,y),1]

h, s, v = cv.split(hsvt)
B = R[h.ravel(), s.ravel()]
B = np.munimum(B, 1)
B = B.reshape(hsvt.shape[:2])

3、应用一个圆盘卷积,B = D * B,其中D是圆盘内核

disc = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5,5))
cv.filter2D(B, -1, disc, B)
B = np.uint8(B)
cv.normalize(B, B, 0, 255, cv.NORM_MINMAX)

4、现在,最大强度的位置给了我们物体的位置。如果我们期望图像中有一个区域,给出一个合适的阈值会有一个很好的结果。

ret, thresh = cv.threshold(B, 50, 255, 0)

OpenCV中的投影

OpenCV提供一个内置的函数cv.calcbackproject()。它的参数几乎与cv.calcHist()函数相同。它的一个参数是直方图,它是这个对象的直方图,我们必须找到它。另外,在传递给backproject函数之前,对象的直方图应该是标准化的。它返回概率图像。然后,我们将图像与磁盘内核进行卷积,并应用阈值。下面是我的代码和输出:

import numpy as np
import cv2 as cv

roi = cv.imread('rose_red.png')
hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)

target = cv.imread('rose.png')
hsvt = cv.cvtColor(target, cv.COLOR_BGR2HSV)

# 计算对象的直方图
roihist = cv.calcHist([hsv], [0,1], None, [180,256], [0,180,0,256])

# 标准化直方图,并应用投影
cv.normalize(roihist, roihist, 0, 255, cv.NORM_MINMAX)
dst = cv.calcBackProject([hsvt], [0,1], roihist, [0,180,0,256], 1)

# 与磁盘内核进行卷积
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5,5))
cv.filter2D(dst, -1, disc, dst)

# 阈值、二进制按位和操作
ret, thresh = cv.threshold(dst, 50, 255, 0)
thresh = cv.merge((thresh, thresh, thresh))
res = cv.bitwise_and(target, thresh)

res = np.vstack((target, thresh, res))
cv.imwrite('res.jpg', res)

下面是一个例子。使用蓝色矩形中的区域作为示例对象,提取想提取全部内容。

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

关于这两种技术的原理可以参考我上面贴的链接,下面是示例的代码:

0x01. 绘制直方图

import cv2.cv as cv
 
def drawGraph(ar,im, size): #Draw the histogram on the image
  minV, maxV, minloc, maxloc = cv.MinMaxLoc(ar) #Get the min and max value
  hpt = 0.9 * histsize
  for i in range(size):
    intensity = ar[i] * hpt / maxV #Calculate the intensity to make enter in the image
    cv.Line(im, (i,size), (i,int(size-intensity)),cv.Scalar(255,255,255)) #Draw the line
    i += 1
 
#---- Gray image
orig = cv.LoadImage("img/lena.jpg", cv.CV_8U)
 
histsize = 256 #Because we are working on grayscale pictures which values within 0-255
 
hist = cv.CreateHist([histsize], cv.CV_HIST_ARRAY, [[0,histsize]], 1)
 
cv.CalcHist([orig], hist) #Calculate histogram for the given grayscale picture
 
histImg = cv.CreateMat(histsize, histsize, cv.CV_8U) #Image that will contain the graph of the repartition of values
drawGraph(hist.bins, histImg, histsize)
 
cv.ShowImage("Original Image", orig)
cv.ShowImage("Original Histogram", histImg)
#---------------------
 
#---- Equalized image
imEq = cv.CloneImage(orig)
cv.EqualizeHist(imEq, imEq) #Equlize the original image
 
histEq = cv.CreateHist([histsize], cv.CV_HIST_ARRAY, [[0,histsize]], 1)
cv.CalcHist([imEq], histEq) #Calculate histogram for the given grayscale picture
eqImg = cv.CreateMat(histsize, histsize, cv.CV_8U) #Image that will contain the graph of the repartition of values
drawGraph(histEq.bins, eqImg, histsize)
 
cv.ShowImage("Image Equalized", imEq)
cv.ShowImage("Equalized HIstogram", eqImg)
#--------------------------------
 
cv.WaitKey(0)

0x02. 反向投影

import cv2.cv as cv
 
im = cv.LoadImage("img/lena.jpg", cv.CV_8U)
 
cv.SetImageROI(im, (1, 1,30,30))
 
histsize = 256 #Because we are working on grayscale pictures
hist = cv.CreateHist([histsize], cv.CV_HIST_ARRAY, [[0,histsize]], 1)
cv.CalcHist([im], hist)

cv.NormalizeHist(hist,1) # The factor rescale values by multiplying values by the factor
_,max_value,_,_ = cv.GetMinMaxHistValue(hist)
 
if max_value == 0:
  max_value = 1.0
cv.NormalizeHist(hist,256/max_value)
 
cv.ResetImageROI(im)
 
res = cv.CreateMat(im.height, im.width, cv.CV_8U)
cv.CalcBackProject([im], res, hist)
 
cv.Rectangle(im, (1,1), (30,30), (0,0,255), 2, cv.CV_FILLED)
cv.ShowImage("Original Image", im)
cv.ShowImage("BackProjected", res)
cv.WaitKey(0)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅析Python中的多进程与多线程的使用
Apr 07 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
Python3最长回文子串算法示例
Mar 04 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
Python Collatz序列实现过程解析
Oct 12 Python
Python使用贪婪算法解决问题
Oct 22 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
pycharm下pyqt4安装及环境配置的教程
Apr 24 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
Python实现视频中添加音频工具详解
Dec 06 Python
Python实现上下班抢个顺风单脚本
Feb 07 #Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 #Python
Python实现抢购IPhone手机
Feb 07 #Python
浅谈python可视化包Bokeh
Feb 07 #Python
详解tensorflow训练自己的数据集实现CNN图像分类
Feb 07 #Python
全面分析Python的优点和缺点
Feb 07 #Python
Tensorflow环境搭建的方法步骤
Feb 07 #Python
You might like
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
uniapp实现可滑动选项卡
2020/10/21 Javascript
Python中itertools模块用法详解
2014/09/25 Python
python中字典dict常用操作方法实例总结
2015/04/04 Python
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Python常用特殊方法实例总结
2019/03/22 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
python scatter函数用法实例详解
2020/02/11 Python
python百行代码自制电脑端网速悬浮窗的实现
2020/05/12 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
夜大毕业自我鉴定
2013/10/11 职场文书
英语专业毕业生自荐信
2013/10/28 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
班班通项目实施方案
2014/02/25 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
统计专业自荐书
2014/07/06 职场文书
计划生育汇报材料
2014/12/26 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
节约用水广告语60条
2019/11/14 职场文书
导游词之南京中山陵
2019/11/27 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
python实现会员信息管理系统(List)
2022/03/18 Python