文章目录

  • 简介
  • 计算概率图像
  • 去噪
  • 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)
分别提取它们的hs通道,并分别计算它们的二维颜色直方图

# 源图片
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(180x256roi
  • I(180x256target
    接着我们计算两者的比率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匹配目标)相关推荐

  1. 基于YOLOv7的室内场景智能识别系统(源码&教程)

    1.项目背景: 近年来,随着移动互联网与定位技术的发展,基于位置服务越来越多地出现在人们的日常生活中.虽然智能手机都包含很多基于位置服务的应用,但是传统的基于位置服务常常将服务范围划分为室内与室外两种 ...

  2. 基于JAVA植物大全和智能识别系统(Springboot框架+AI人工智能) 开题报告

      本科生毕业论文 基于Java(springboot框架)植物大全和智能识别系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学 ...

  3. 基于JAVA动物大全和智能识别系统(Springboot框架+AI人工智能) 开题报告

      本科生毕业论文 基于Java(springboot框架)动物大全和智能识别系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学 ...

  4. 基于太赫兹的危险品智能识别系统

    基于太赫兹和深度学习的危险品智能识别系统 刘宁宁  (河南中光学集团有限公司 河南 南阳 ) 摘  要:基于太赫兹线性扫描成像和深度学习技术,实现包裹危险品的实时智能识别.采用太赫兹线性扫描成像技术, ...

  5. Coding-Party 基于飞桨的农作物智能识别系统病虫害识别

    目录 Coding-Party 基于飞桨的农作物智能识别系统 病虫害识别 Coding-Party 基于飞桨的农作物智能识别系统 联合国粮食及农业组织最近的一份报告表明,每年农业生产的自然损失中有三分 ...

  6. linux自动识别车牌设计,基于Linux的车牌智能识别系统的设计与实现

    摘要: 随着人们生活水平的不断提高,越来越多的技术应用到人们的日常生活中,通信技术和计算机技术与人们的生活密切相连,应用在视频监控.数码网络等方面,这些技术为人们的生活提供了强有力的保障.如何设计一套 ...

  7. Springboot毕业设计毕设作品,果蔬大全和智能识别系统 开题报告

      本科生毕业论文 基于Java(springboot框架)果蔬大全和智能识别系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学 ...

  8. Springboot毕业设计毕设作品,动物大全和智能识别系统 开题报告

      本科生毕业论文 基于Java(springboot框架)动物大全和智能识别系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学 ...

  9. 毕业设计--智能环境监测系统基于harmonyOS的移动端应用开发

    目录 第一章 绪论 1.1 引言 1.2 智能环境监测APP概述 1.3 课题设计思路 第二章 项目开发环境 2.1 鸿蒙介绍 2.1.1 鸿蒙的发展史 2.1.2 鸿蒙应用开发的意义 2.1.3 H ...

最新文章

  1. 4-1 图像特效介绍
  2. cv2.setNumThreads
  3. delphi中的bpl开发注意事项
  4. CVPR 2022 接收结果出炉!录用 2067 篇,接收数量上升24%(附最新论文下载)
  5. 异步编程的 async/await
  6. Part1 R语言的基本操作
  7. 向程序发送命令失败_java程序员进阶:Redis分布式技术问题集锦
  8. java数组排序冒泡排序_java数组常见的排序——选择排序和冒泡排序
  9. 使用POI转换word doc文件
  10. Sass 基本特性-基础 笔记
  11. vs2013连接数据库
  12. Qt编写地图综合应用30-世界地图
  13. 线上幽灵:世界头号黑客米特尼克自传
  14. java查找pdf关键字_Java定位PDF中关键字的坐标
  15. 信息技术领域会议(技术领域和非技术领域)
  16. 电脑开机无logo,进不了bios
  17. 电脑上的ofd格式文件如何打开呢_ofd文件怎么打开用什么软件
  18. ,进门安卓手机首选 三星盖世S5670评测
  19. 学财会的懂计算机会加分吗,财会大学生在大学期间可以考这些证书
  20. 程序媛眼中的程序员,piupiu~

热门文章

  1. MyBatis_多表操作
  2. asc文件转出为tiff文件
  3. 格雷希尔GripSeal液压快速接头的构造和原理
  4. VFP用JAVA的字节数组上传文件,赵总足足等了30分钟,眼泪哗哗直往下流
  5. in函数在润乾报表的应用
  6. 绩效管理常见的7大误区,越用企业越走下坡路!
  7. 转载_设计师/开发者看过来,七月35款新工具速递!
  8. UltraISO 制作 winxp 启动U盘,出现 INF file txtsetup.sif is corrupt or missing 故障解决方法(附 WinSetupFromUSB下载链接)
  9. 【解决方法】INF file txtsetup.sif is corrupt or missing /// 使用WinSetupFromUSB来U盘安装windows2003(不使用win PE系统)
  10. 关于短信群发软件的开发