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 相关文章推荐
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 Python
python连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
python3.6使用pickle序列化class的方法
Oct 22 Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
python tkinter基本属性详解
Sep 16 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
pytorch中图像的数据格式实例
Feb 11 Python
jupyter使用自动补全和切换默认浏览器的方法
Nov 18 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 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 在线导入mysql大数据程序
2015/06/11 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
基于php编程规范(详解)
2017/08/17 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
基于datagrid框架的查询
2013/04/08 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
VueJS全面解析
2016/11/10 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
js实现单张图片平移切换效果
2017/10/11 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
Python django框架 web端视频加密的实例详解
2020/11/20 Python
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
求职简历推荐信范文
2013/12/02 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
警示教育片观后感
2015/06/17 职场文书