反向投影法

2023-11-01

  反向投影法是用已知图像的某些特征来突出其它图像中此类特征的一种方法,基于直方图。

  主要步骤如下:

  1、统计已知图像某个特征的色度直方图,通常用色度-饱和度(Hue-Saturation)来统计二维直方图,并把直方图表示为概率的形式。

  2、选取测试图像,对于图像中的每一个像素,查看它的色度在已统计直方图上的概率,用这个概率来重建整张图像。

  3、最后把重建出的图像归一化,会发现用于统计直方图的特征被突出出来。

  举OpenCV的例子,已知图像如下:

  我们称之为模型。选取图中的手作为要统计的特征,它的mask如下:

  于是可以统计得到手的Hue-Saturation直方图和联合概率分布(看做相互独立)的热度图:

  测试图片是另一张手的图像:

  然后执行第三步:

  可以发现手被突出出来了,这是因为,相同物体在不同的图像中的色值通常是相近的,因此可以通过这种方式来突出它。如果把上图当做mask对原测试图进行遮罩,还可以把手的图片单独提取出来:

  Python代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
  
#获取mask、model、test图像数据,并进行预处理
mask = plt.imread('mask.jpg')[:,:,0] 
mask = ((mask<120)*255).astype(np.uint8) 
n = np.sum(mask>100)
model = cv2.cvtColor(plt.imread('model.jpg'),cv2.COLOR_RGB2HSV)#把RGB颜色空间转换为HSV
test = cv2.cvtColor(plt.imread('test.jpg'),cv2.COLOR_RGB2HSV) 

#根据色度和饱和度(明度不考虑),统计model颜色信息,并绘制直方图和它们联合分布的热度图
hist_size = 50  #直方图划分的区间数量
hist_h = cv2.calcHist([model],[0],mask,[hist_size],[0,256])/n
hist_s = cv2.calcHist([model],[1],mask,[hist_size],[0,256])/n 
hot_values = np.matmul(hist_s, hist_h.T) 

fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.bar(range(len(hist_h)),hist_h[:,0])
ax1.bar(range(len(hist_s)),hist_s[:,0])  
hot = ax2.imshow(hot_values)
plt.colorbar(hot)
plt.show()
  
#使用热度图重建test图像
projection = np.zeros([test.shape[0],test.shape[1]])
for i in range(projection.shape[0]):
  for j in range(projection.shape[1]):
    h_pos = (test[i,j,0]/256*hist_size).astype(np.uint8)
    s_pos = (test[i,j,1]/256*hist_size).astype(np.uint8) 
    projection[i,j] = hist_h[h_pos] * hist_s[s_pos]  
 
projection = projection / np.max(projection)
plt.imshow(projection,cmap='gray') 
plt.show()

#用反向投影法重建的图像当做mask提取原图
recons = cv2.cvtColor(test,cv2.COLOR_HSV2RGB)*(projection[:,:,np.newaxis] > 0.00005)
plt.imshow(recons) 
plt.show()

  我们还可以用RGB来统计,建立RGB的三维联合分布,然后对测试图像进行重建,效果如下:

  可以看出突出效果并没有H-S模型来得好。代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
  
mask = plt.imread('mask.jpg')[:,:,0] 
mask = ((mask<120)*255).astype(np.uint8) 
n = np.sum(mask>100)
model = plt.imread('model.jpg')
test = plt.imread('test.jpg') 
hist_size = 50  #直方图划分的区间数量
hist_r = cv2.calcHist([model],[0],mask,[hist_size],[0,256])[:,0]/n
hist_g = cv2.calcHist([model],[1],mask,[hist_size],[0,256])[:,0]/n
hist_b = cv2.calcHist([model],[2],mask,[hist_size],[0,256])[:,0]/n
  
plt.bar(range(len(hist_r)),hist_r)
plt.bar(range(len(hist_g)),hist_g)
plt.bar(range(len(hist_b)),hist_b)
plt.show()

projection = np.zeros([test.shape[0],test.shape[1]])
for i in range(projection.shape[0]):
  for j in range(projection.shape[1]):
    r_pos = (test[i,j,0]/256*hist_size).astype(np.uint8)
    g_pos = (test[i,j,1]/256*hist_size).astype(np.uint8)
    b_pos = (test[i,j,2]/256*hist_size).astype(np.uint8)
    projection[i,j] = hist_r[r_pos] * hist_g[g_pos] * hist_b[b_pos]
 
projection = projection / np.max(projection)
plt.imshow(projection,cmap='gray') 
plt.show()

   参考自:https://docs.opencv.org/master/da/d7f/tutorial_back_projection.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反向投影法 的相关文章

  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • 希伯来语中的稀疏句子标记化错误

    尝试对希伯来语使用稀疏句子标记 import spacy nlp spacy load he doc nlp text sents list doc sents I get Warning no model found for he Onl
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • 将文本注释到轴并对齐为圆

    我正在尝试在轴上绘制文本并将该文本与圆对齐 更准确地说 有一些具有不同坐标 x y 的点位于该圆内 并使用以下命令创建 ax scatter x y s 100 我想用圆圈连接并标记每个点 Cnameb 文本的坐标由 xp yp 定义 因此
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 检测 IDLE 的存在/如何判断 __file__ 是否未设置

    我有一个脚本需要使用 file 所以我了解到 IDLE 没有设置这个 有没有办法从我的脚本中检测到 IDLE 的存在 if file not in globals file is not set 如果你想做一些特别的事情 file 未设置
  • 对数据帧的每 2 小时数据进行 Groupby

    我有一个数据框 Time T201FN1ST2010 T201FN1VT2010 1791 2017 12 26 00 00 00 854 69 0 87 1792 2017 12 26 00 20 00 855 76 0 87 1793
  • 如何循环遍历字典列表并打印特定键的值?

    我是 Python 新手 有一个问题 我知道这是一个非常简单的问题 运行Python 3 4 我有一个需要迭代并提取特定信息的列表 以下是列表 称为部分 的示例 已截断 数千个项目 state DEAD id phwl type name
  • python sklearn中的fit方法

    我问自己关于 sklearn 中拟合方法的各种问题 问题1 当我这样做时 from sklearn decomposition import TruncatedSVD model TruncatedSVD svd 1 model fit X
  • 使用 urllib 编码时保持 url 参数有序

    我正在尝试用 python 模拟 get 请求 我有一个参数字典 并使用 urllib urlencode 对它们进行 urlencode 我注意到虽然字典的形式是 k1 v1 k2 v2 k3 v3 urlencoding 后参数的顺序切

随机推荐

  • Anaconda常用命令小结

    在服务器上面使用Anaconda 经常会涉及一些命令 在各种任务之间徘徊 有时会忘记一些命令行 经常也会百度查一下 不如做一个小结 给自己蹭一下流量 1 检验是否安装以及当前conda的版本 conda V 2 创建python虚拟环境 c
  • Tomcat8 WEB-INF更改class后 用manager实现reload

    Tomcat8 更改WEB INF 下的class后 用自带manager实现reload 解决了困扰很长时间的问题 1 适用场景 2 解决思路之一 用tomcat自带manager工具 3 详细步骤 4 官网文档地址 5 不适用情况 解决
  • Vue键盘事件

    键盘事件
  • Fastjson

    Fastjson 是一个java类库 可以被用来把Java对象转换成Json方式 也可以把Json字符串转换成对应的Java对象 Fastjson可以作用于任何Java对象 包含没有源代码已存在的对象 目标 在服务器端或是adroid提供一
  • AtCoder Beginner Contest 286—C—Rotate and Palindrome

    题目链接 题意 给我一个长度为N的字符串S 你可以执行以下两种操作 0次或者更多次 以任意的顺序执行 1 支付A元 移动S的最左边的字符到最右边 换句话说 就是 S1 S2 Sn gt S2 Sn S1 2 支付B元 在 1 n之间选择一个
  • 前端难点,坑点总结

    问题总结 前言 登录验证码图片显示 post下载文件 js调用ie浏览器的打印功能打印网页上内容 移动端适配不同的屏幕 ie9浏览器异步上传文件 ie浏览器 input标签会出现ie自带叉号 使用flex布局 文字超出部分变省略号 移动端1
  • 初级测试开发工程师应该学些什么

    作为一个毕业半年的我来说 换了两份工作 现在在游戏公司做测试开发工程师 也就不到两个月吧 之前在学校学了C C 数据结构 算法设计等 但也只是考试过了 还是菜鸟一枚 然后来到公司 有做一些兼容性测试之类的 前一个星期给我一个星期做一个网页爬
  • sbt使用教程

    sbt使用教程 sbt 配置 sbt 单项目构建 sbt 多项目构建 sbt 配置定义 sbt 任务定义 sbt 作用域 sbt 插件 总结 项目地址 https gitee com jyq 18792721831 studyspark g
  • UBUNTU 18.04 安装CUDA 10.1 (解决循环登入的问题)

    我之前安装CUDA 会导致重启后卡在登入页面 查询了很多资料后 终于安装成功了 以下记录了我的安装过程 0 安装gcc和make sudo apt get install gcc sudo apt get install make 1 禁用
  • Oracle12报错:ERROR at line 1: ORA-01109: database not open

    描述 想要修改用户密码的时候发现报错 ERROR at line 1 ORA 01109 database not open 解决 发现当前容器的模式为MOUNTED 将其open即可 SQL gt select con id name o
  • IDEA中使用Debug教程

    Debug用来追踪代码的运行流程 通常在程序运行过程中出现异常 启用Debug模式可以分析定位异常发生的位置 以及在运行过程中参数的变化 通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码 一 Debug开篇 首先看下
  • 【Linux专栏】Linux 常用文件管理命令(常用命令大全)

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏定位 为 0 基础刚入门 Linux 的小伙伴整理的详细笔记 也欢迎大佬们一起交流 专栏地址 https blog c
  • 运算符重载、模板、标准模板库STL

    C day4 运算符重载 当我们要对自己定义的数据类型进行运算的时候 编译器识别不了 所以没法进行 这时就需要我们自己来写对应的运算符计算的规则 运算符对应的操作数有几个 重载完之后操作数的个数是不能发生变化 重载的方式 1 成员函数进行重
  • 失业在家做什么赚钱好?失业在家怎么赚钱?

    在目前经济形势下 由于诸多客观因素的影响 导致很多人失业在家 无事可做 这样就会导致一个家庭陷入生活困境 面临这种情况 一个人失业在家 可以做什么赚钱呢 1 直播 现在直播经济那么火 很多人也开始各种直播 最省事的就是直播睡觉 当然 也可以
  • js日期的格式化

    function formatDate cellValue 传入毫秒数 if cellValue null cellValue return var date new Date cellValue var year date getFull
  • MyEclipse安装JRebel插件实现热部署

    为什么要使用JRebel 之前用MyEclipse做Java Web开发的时候 有一个很头疼的问题 每次修改后台代码之后 都需要重新将项目部署到tomcat 然后启动tomcat重新运行项目才能查看修改后的结果 浪费不少时间 现在 给MyE
  • MySQL触发器怎么写?

    废话不多说 这篇文章主要讲 从0 到写两个简单的触发器 3分钟学会 工具 Navicat Premium 黄色的三叶草图标 触发器1 BEGIN IF new state in 2 3 then INSERT INTO userservic
  • Django学习 day1

    目录 Django简介 HTTP原理 Django简介 Python语言里最流行 强大的Web框架 同时亦是全球第5大WEB框架 可快速构建稳定强大的WEB项目 大大提高开发效率 很多知名项目都是基于Django开发 如Disqus Pin
  • pytorch使用早停策略

    文章目录 早停的目的与流程 早停策略 pytorch使用示例 参考网站 早停的目的与流程 目的 防止模型过拟合 由于深度学习模型可以无限迭代下去 因此希望在即将过拟合时 或训练效果微乎其微时停止训练 流程如下 将数据集切分为三部分 训练数据
  • 反向投影法

    反向投影法是用已知图像的某些特征来突出其它图像中此类特征的一种方法 基于直方图 主要步骤如下 1 统计已知图像某个特征的色度直方图 通常用色度 饱和度 Hue Saturation 来统计二维直方图 并把直方图表示为概率的形式 2 选取测试