智能识别系统---基于颜色直方图的相似目标查找(图像去噪,MeanShift匹配目标)
文章目录
- 简介
- 计算概率图像
- 去噪
- MeanShift匹配目标
- MeanShift介绍
- 代码
(原地TP)
不清除什么是颜色直方图和反向投影的同学可以先看这一篇
简介
基于颜色直方图的相似目标查找的主要流程为
- 将图像的颜色空间由
BGR
转为HSV
- 获取HSV颜色空间中关于
色调
的颜色直方图(或者提取h
,s
双通道,计算二维颜色直方图
) - 计算得到
颜色概率图
- 去除噪声(取高饱和度图像作为模板,去掉低饱和度的地方(可以理解为是比较暗的地方))
MeanShift
匹配目标(取密度高的部位)
计算概率图像
# 对图像 读取,显示以及各种操作
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import warnings
warnings.filterwarnings('ignore')
导入原图,分别为目标图像(target)
和感兴趣区域图像(roi)
分别提取它们的h
和s
通道,并分别计算它们的二维颜色直方图
# 源图片
target=cv.imread('image/baboon1.jpg')
hsvt=cv.cvtColor(target,cv.COLOR_BGR2HSV)
# 感兴趣区域
roi=cv.imread('image/baboon_face.jpg')
hsv=cv.cvtColor(roi,cv.COLOR_BGR2HSV)
# 提取了h,s两个通道,绘制二维直方图
## roi区域
M=cv.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])
## target区域
I=cv.calcHist([hsvt],[0,1],None,[180,256],[0,180,0,256])# 打印原图片
plt.figure(figsize=[10,8])
plt.subplot(1,2,1)
plt.imshow(cv.cvtColor(target,cv.COLOR_BGR2RGB))
plt.title('target image')plt.subplot(1,2,2)
plt.imshow(cv.cvtColor(roi,cv.COLOR_BGR2RGB))
plt.title('roi image')plt.show()
经过计算之后我们得到了两个二维直方图
- M(
180x256
,roi
) - I(
180x256
,target
)
接着我们计算两者的比率R
h和s是target图像的h通道和s通道(为二维矩阵),将其展开之后
意味着对于原图片中每一个位置 a i , j a_{\ i,j} a i,j(每一个像素),都会根据 ( h i , s j ) (h_i,s_j) (hi,sj)去关于h,s的概率矩阵R
中提取对应位置(对应像素)的值 R i , j R_{i,j} Ri,j,这个值意味着在target图像上,这个像素属于roi图像的概率
这就意味着原图片中的每一个位置都会得到一个概率值
所以B为概率图像
# 计算比率,M为roi image,I为target image
# 此时的R仍为一个二维直方图,只不过此时每个元素的值为一个概率
R=M/I
h,s,v = cv.split(hsvt)# 分割目标的通道
'''
h: 色调值
s: 饱和度
'''
# h和s是h通道和s通道的矩阵,将其展开之后
# 意味着对于原图片中每一个位置,根据(h,s)去关于h,s的概率矩阵R中提取概率值
# 这就意味着原图片中的每一个位置都会得到一个概率值
# 所以B为概率图像
B = R[h.ravel(),s.ravel()]
B = np.minimum(B,1)
B = B.reshape(hsvt.shape[:2])
颜色概率图
plt.figure(figsize=[10,8])
plt.imshow(B,cmap='gray')
去噪
提取高饱和度位置
对饱和度通道进行二值化
_,thresh_s=cv.threshold(s,100,255,cv.THRESH_BINARY)
plt.figure(figsize=[10,8])
plt.imshow(thresh_s,cmap='gray')
去除噪声点
res=cv.bitwise_and(B,B,mask=thresh_s)
plt.figure(figsize=[10,8])
plt.imshow(res,cmap='gray')
B=res
对图像利用高斯核进行卷积,轻微模糊图像
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))#定义结构形状,5×5的椭圆
B_denoise = cv.filter2D(B_denoise,-1,disc)#对图像进行卷积运算
B_denoise = np.uint8(B_denoise)
cv.normalize(B,B,0,255,cv.NORM_MINMAX)
# 概率图像
plt.figure(figsize=[10,8])
plt.imshow(B_denoise,cmap='gray')
阈值图像(二值化)
将概率图像B按照thresh变为01矩阵
ret,thresh=cv.threshold(B_denoise,40,255,cv.THRESH_BINARY)
plt.figure(figsize=[10,8])
plt.imshow(thresh,cmap='gray')
将thresh矩阵与原图像进行按位和,保留thresh=1的像素点
tmp_target=cv.cvtColor(target,cv.COLOR_BGR2RGB)
res=cv.bitwise_and(tmp_target,tmp_target,mask=thresh)
plt.figure(figsize=[10,8])
plt.imshow(res,cmap='gray')
总的"基于颜色直方图的相似目标查找的代码"
def findSimilarTarget_baseHist(target,roi,extent_denoise=90,extent_binary=40):# 提取了h,s两个通道,绘制二维直方图hsvt=cv.cvtColor(target,cv.COLOR_BGR2HSV)# 源图片I=cv.calcHist([hsvt],[0,1],None,[180,256],[0,180,0,256])hsv=cv.cvtColor(roi,cv.COLOR_BGR2HSV)# 感兴趣区域M=cv.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])# 计算概率图像R=M/Ih,s,v = cv.split(hsvt)# 分割目标的通道B = R[h.ravel(),s.ravel()]B = np.minimum(B,1)B = B.reshape(hsvt.shape[:2])# 去噪# 提取图片高饱和度位置_,thresh_s=cv.threshold(s,extent_denoise,255,cv.THRESH_BINARY)# 去噪B_denoise=cv.bitwise_and(B,B,mask=thresh_s)# 对概率图像利用高斯核进行卷积,轻微模糊图像disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))#定义结构形状,5×5的椭圆B_denoise = cv.filter2D(B_denoise,-1,disc)#对图像进行卷积运算B_denoise = np.uint8(B_denoise)cv.normalize(B,B,0,255,cv.NORM_MINMAX)# 将概率图像B按照thresh变为01矩阵_,thresh=cv.threshold(B_denoise,extent_binary,255,cv.THRESH_BINARY)# 将thresh矩阵与原图像进行按位和,保留thresh=1的像素点tmp_target=cv.cvtColor(target,cv.COLOR_BGR2RGB)res=cv.bitwise_and(tmp_target,tmp_target,mask=thresh)return res
测试
res=findSimilarTarget_baseHist(target,roi,extent_denoise=90,extent_binary=0)
plt.figure(figsize=[10,8])
plt.imshow(res,cmap='gray')
MeanShift匹配目标
MeanShift介绍
均值漂移是一种聚类算法,沿着密度最高的方向不断前进,直至算法收敛
我们可以利用这个聚类算法来在经过处理的概率图像上找到对应的位置,进行目标跟踪
代码
r,h,c,w = 250,50,110,40 # 定位狒狒的脸
track_window = (c,r,w,h)# 设置 ROI(图像范围)以进行跟踪
roi = target[r:r+h, c:c+w]
# 转换颜色空间
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
hsvt = cv.cvtColor(target, cv.COLOR_BGR2HSV)# 设阈值,去除背景部分
# 设置s,v通道的范围为(60~255),(32,255)
mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
# 计算直方图
roi_hist = cv.calcHist([hsv_roi],[0],mask,[180],[0,180])
# 标准化直方图
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)# 设置结束标志,10 次迭代或至少 1 次移动
term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )# 计算反向投影
'''
images :输入图像,注意加 [];
channels:通道,通道数必须与直方图维度相匹配,
hist:图象的直方图;
ranges:直方图的变化范围;
scale:输出反投影的可选比例因子。
'''
dst = cv.calcBackProject([hsvt],[0],roi_hist,[0,180],1)# 运行 meanshift 算法用以获取新的位置
ret, track_window = cv.meanShift(dst, track_window, term_crit)# 绘制到新图像中
x,y,w,h = track_window
img2 = cv.rectangle(cv.cvtColor(target, cv.COLOR_BGR2RGB), (x,y), (x+w,y+h), 255,2)
plt.imshow(img2)
智能识别系统---基于颜色直方图的相似目标查找(图像去噪,MeanShift匹配目标)相关推荐
- 基于YOLOv7的室内场景智能识别系统(源码&教程)
1.项目背景: 近年来,随着移动互联网与定位技术的发展,基于位置服务越来越多地出现在人们的日常生活中.虽然智能手机都包含很多基于位置服务的应用,但是传统的基于位置服务常常将服务范围划分为室内与室外两种 ...
- 基于JAVA植物大全和智能识别系统(Springboot框架+AI人工智能) 开题报告
本科生毕业论文 基于Java(springboot框架)植物大全和智能识别系统 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: XXXX大学 ...
- 基于JAVA动物大全和智能识别系统(Springboot框架+AI人工智能) 开题报告
本科生毕业论文 基于Java(springboot框架)动物大全和智能识别系统 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: XXXX大学 ...
- 基于太赫兹的危险品智能识别系统
基于太赫兹和深度学习的危险品智能识别系统 刘宁宁 (河南中光学集团有限公司 河南 南阳 ) 摘 要:基于太赫兹线性扫描成像和深度学习技术,实现包裹危险品的实时智能识别.采用太赫兹线性扫描成像技术, ...
- Coding-Party 基于飞桨的农作物智能识别系统病虫害识别
目录 Coding-Party 基于飞桨的农作物智能识别系统 病虫害识别 Coding-Party 基于飞桨的农作物智能识别系统 联合国粮食及农业组织最近的一份报告表明,每年农业生产的自然损失中有三分 ...
- linux自动识别车牌设计,基于Linux的车牌智能识别系统的设计与实现
摘要: 随着人们生活水平的不断提高,越来越多的技术应用到人们的日常生活中,通信技术和计算机技术与人们的生活密切相连,应用在视频监控.数码网络等方面,这些技术为人们的生活提供了强有力的保障.如何设计一套 ...
- Springboot毕业设计毕设作品,果蔬大全和智能识别系统 开题报告
本科生毕业论文 基于Java(springboot框架)果蔬大全和智能识别系统 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: XXXX大学 ...
- Springboot毕业设计毕设作品,动物大全和智能识别系统 开题报告
本科生毕业论文 基于Java(springboot框架)动物大全和智能识别系统 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: 指导教师: XXXX大学 ...
- 毕业设计--智能环境监测系统基于harmonyOS的移动端应用开发
目录 第一章 绪论 1.1 引言 1.2 智能环境监测APP概述 1.3 课题设计思路 第二章 项目开发环境 2.1 鸿蒙介绍 2.1.1 鸿蒙的发展史 2.1.2 鸿蒙应用开发的意义 2.1.3 H ...
最新文章
- GoogleNet - Going deeper with convolutions
- linux无法启动之-“/dev/xxx unexpected inconsistency, run fsck manually”的解决
- CICC科普栏目丨时间之箭:从熵到大爆炸再到万物理论(一)
- mysql 分组排序_MySQL如何实现Excel分组排序功能?
- install ros indigo tf2
- Windows XP Mode
- optee中TA的堆的分配
- 1. 初探MongoDB —— 介绍、安装和配置
- range python 3.6 type class_Python 3.6 有什么新特性
- SpringBoot自学汇总
- vs官方使用教程中文版与英文版
- 本地配置DNS服务器(MAC版)
- JDK 10:从Java访问Java应用程序的进程ID
- 窗体应用程序:四则运算
- c语言编程概念与观点,从程序设计本质入手,上好C语言第一课.doc
- paip.c++ gui 库HtmLayout 的优缺点 QT优点
- 三星手机性能测试软件,5部手机性能测试:红米垫底三星倒数第三 第一当之无愧...
- python统计单词出现次数 青少年编程电子学会python编程等级考试二级真题解析2022年3月
- 我的世界斗罗封神服务器怎么注册,我的世界斗罗封神服务器-我的世界斗罗封神mod手机版v1.17.2.01-游戏宝手游网...
- 微信小程序项目转换成uniapp项目