傅里叶图像相关性匹配-《医学图像处理》小作业五-Python代码/Matlab代码

2023-11-15

天津中医药大学-20级医学信息工程   教师:王翌   学生:邓集亲

学长我是用的python写的,matlab同样可以参考

实验五:相关性匹配

作业要求:

  1. 参考“傅里叶变换”课的内容,采用快速傅里叶变换(FFT)进行相关性匹配,如下图示例输出结果图片。

例子:

通过相关性匹配找到感兴趣的物体区域:

实验图片:

匹配图片:match.jpg

模板图片:match_window.jpg

再自选其它至少20张图片(包括灰度图片和彩色图片)。

  二维傅里叶变换用于分析图像的频率特性,对采样的离散信号进行傅里叶变换,得到周期性的NDFT。可以将图像视为在两个方向上采样的信号。因此,在XY方向都进行傅立叶变换,可以得到图像的频率表示。

  更直观地说,对于正弦信号,如果幅度在短时间内变化很快,则可以说它是高频信号。如果变化缓慢,则为低频信号。

  将相同的想法扩展到图像。图像中的振幅在哪里急剧变化?在边缘点或噪声。因此,可以说边缘和噪声是图像中的高频内容。如果幅度没有太大变化,则它是低频分量。

  模板匹配的原理就是利用目标的边缘信息用于搜索目标图像的模板所在位置,然后将模板图像在输入图像上滑动匹配,找到最大匹配度,模板匹配就完成了。

#导入库
import numpy as np
import cv2 as cv
from numpy.core import asarray, zeros, swapaxes, take
from numpy.core.multiarray import normalize_axis_index
from numpy.fft import _pocketfft_internal as pfi

#定义函数进行fft变换计算
def raw_fft(a, n, axis, is_real, is_forward, inv_norm):   #为了变换结果,这里需要定义浮点数inv_norm
    axis = normalize_axis_index(axis, a.ndim)
    if n is None:
        n = a.shape[axis]

    fct = 1/inv_norm

    if a.shape[axis] != n:
        s = list(a.shape)
        index = [slice(None)]*len(s)
        if s[axis] > n:
            index[axis] = slice(0, n)
            a = a[tuple(index)]
        else:
            index[axis] = slice(0, s[axis])
            s[axis] = n
            z = zeros(s, a.dtype.char)
            z[tuple(index)] = a
            a = z

    if axis == a.ndim-1:
        r = pfi.execute(a, is_real, is_forward, fct)
    else:
        a = swapaxes(a, axis, -1)
        r = pfi.execute(a, is_real, is_forward, fct)
        r = swapaxes(r, axis, -1)
    return r

def fft(a, n=None, axis=-1):   #定义一维傅里叶变换函数
    a = asarray(a)
    if n is None:
        n = a.shape[axis]
    inv_norm = 1
    output = raw_fft(a, n, axis, False, True, inv_norm)
    return output


def ifft(a, n=None, axis=-1):
    a = asarray(a)
    if n is None:
        n = a.shape[axis]
    inv_norm = n
    output = raw_fft(a, n, axis, False, False, inv_norm)
    return output

def cook_nd_args(a, shape=None, axes=None, invreal=0):
    if shape is None:
        shapeless = 1
        if axes is None:
            shape = list(a.shape)
        else:
            shape = take(a.shape, axes)
    else:
        shapeless = 0
    shape = list(shape)
    if axes is None:
        axes = list(range(-len(shape), 0))
    if invreal and shapeless:
        shape[-1] = (a.shape[axes[-1]] - 1) * 2
    return shape, axes


def raw_fftnd(a, shape=None, axes=None, function=fft):
    a = asarray(a)
    shape, axes = cook_nd_args(a, shape, axes)
    itl = list(range(len(axes)))
    itl.reverse()
    for ii in itl:
        a = function(a, n=shape[ii], axis=axes[ii])
    return a
def imagefft2(a, shape=None, axes=(-2, -1)):   #图片二维傅里叶变换
    return raw_fftnd(a, shape, axes, fft)


def imageifft2(a, shape=None, axes=(-2, -1)):
    return raw_fftnd(a, shape, axes, ifft)

#读取图像

original = cv.imread(r"D:\deng\smalljob\ImageSet\match.jpg")   #待匹配的原图像
template = cv.imread(r"D:\deng\smalljob\ImageSet\match_window.jpg")   #需要匹配的部分

original_gray = cv.cvtColor(original, cv.COLOR_BGR2GRAY)   #将图像从RGB颜色空间转换到灰度颜色空间
template_gray = cv.cvtColor(template, cv.COLOR_BGR2GRAY)

t_height, t_width = template_gray.shape
o_height, o_width = original_gray.shape
#傅里叶变换

t_fft = imagefft2(template_gray, shape=(o_height, o_width))
o_fft = imagefft2(original_gray)

c = imageifft2(np.multiply(o_fft, t_fft.conj()) / np.abs(np.multiply(o_fft, t_fft.conj())))
c = c.real

result = np.where(c == np.amax(c))

#压缩 2 个数组以获得确切的坐标
max_coordinate = list(zip(result[0], result[1]))[0]
print(max_coordinate)

start_point = (max_coordinate[1], max_coordinate[0] )
end_point = (max_coordinate[1] + t_height, max_coordinate[0] + t_width)

#用绿色矩形方框囊括匹配结果

color = (0, 255, 0)
thickness = 2
image = cv.rectangle(original, start_point, end_point, color, thickness)
cv.imshow("fft matching", image)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果

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

傅里叶图像相关性匹配-《医学图像处理》小作业五-Python代码/Matlab代码 的相关文章

  • Python Popen 与 psexec 挂起 - 不良结果

    我对 subprocess Popen 和我认为是管道的问题有疑问 我有以下代码块 从 cli 运行时 100 都不会出现问题 p subprocess Popen psexec serverName get cmd c ver echo
  • 使用 python 进行串行数据记录

    Intro 我需要编写一个小程序来实时读取串行数据并将其写入文本文件 我在读取数据方面取得了一些进展 但尚未成功地将这些信息存储在新文件中 这是我的代码 from future import print function import se
  • python future 和元组解包

    实现像使用 future 进行元组解包这样的事情的优雅 惯用的方法是什么 我有这样的代码 a b c f x y g a b z h y c 我想将其转换为使用期货 理想情况下我想写一些类似的东西 a b c ex submit f x y
  • 我怎样才能更多地了解Python的内部原理? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我使用Python编程已经有半年多了 我对Python内部更感兴趣 而不是使用Python开发应用程序
  • 如何迭代按值排序的 Python 字典?

    我有一本字典 比如 a 6 b 1 c 2 我想迭代一下by value 不是通过键 换句话说 b 1 c 2 a 6 最直接的方法是什么 sorted dictionary items key lambda x x 1 对于那些讨厌 la
  • python 模拟第三方模块

    我正在尝试测试一些处理推文的类 我使用 Sixohsix twitter 来处理 Twitter API 我有一个类充当 Twitter 类的外观 我的想法是模拟实际的 Sixohsix 类 通过随机生成新推文或从数据库检索它们来模拟推文的
  • 如何使用 imaplib 获取“消息 ID”

    我尝试获取一个在操作期间不会更改的唯一 ID 我觉得UID不好 所以我认为 Message ID 是正确的 但我不知道如何获取它 我只知道 imap fetch uid XXXX 有人有解决方案吗 来自 IMAP 文档本身 IMAP4消息号
  • 在 Python distutils 中从 setup.py 查找脚本目录的正确方法?

    我正在分发一个具有以下结构的包 mymodule mymodule init py mymodule code py scripts script1 py scripts script2 py The mymodule的子目录mymodul
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • 填充两个函数之间的区域

    import matplotlib pyplot as plt import numpy as np def domain x np arange 0 10 0 001 f1 lambda x 2 x x 2 0 5 plt plot x
  • 忽略 Mercurial hook 中的某些 Mercurial 命令

    我有一个像这样的善变钩子 hooks pretxncommit myhook python path to file myhook 代码如下所示 def myhook ui repo kwargs do some stuff 但在我的例子中
  • 以同步方式使用 FastAPI,如何获取 POST 请求的原始正文?

    在中使用 FastAPIsync not async模式 我希望能够接收 POST 请求的原始 未更改的正文 我能找到的所有例子都显示async代码 当我以正常同步方式尝试时 request body 显示为协程对象 当我通过发布一些内容来
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 如何从Python中的字符串中提取变量名称和值

    我有一根绳子 data var1 id 12345 name John White python中有没有办法将var1提取为python变量 更具体地说 我对字典变量感兴趣 这样我就可以获得变量的值 id和name python 这是由提供
  • 如何在 OSX 上安装 numpy 和 scipy?

    我是 Mac 新手 请耐心等待 我现在使用的是雪豹 10 6 4 我想安装numpy和scipy 所以我从他们的官方网站下载了python2 6 numpy和scipy dmg文件 但是 我在导入 numpy 时遇到问题 Library F
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • 当鼠标悬停在上面时,intellisense vscode 不显示参数或文档

    我正在尝试将整个工作流程从 Eclipse 和 Jupyter Notebook 迁移到 VS Code 我安装了 python 扩展 它应该带有 Intellisense 但它只是部分更糟糕 我在输入句点后收到建议 但当将鼠标悬停在其上方
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • 从 Twitter API 2.0 获取 user.fields 时出现问题

    我想从 Twitter API 2 0 端点加载推文 并尝试获取标准字段 作者 文本 和一些扩展字段 尤其是 用户 字段 端点和参数的定义工作没有错误 在生成的 json 中 我只找到标准字段 但没有找到所需的 user fields 用户

随机推荐

  • 数字图像散斑计算Matlab连续处理1/2

    数字图像散斑计算Matlab连续处理 1 数字散斑相关测量法原理 2 打开 All m 文件 设置路径 3 运行程序 输入参考图像序号 4 框选高对比度区域 下图左图 双击以结束 结果后为下图右图 5 回到命令行 输入高对比度区域裁剪位置
  • RabbitMQ(二)confirm/return机制

    程序用了1 5 3 RELEASE版本的spring boot starter amqp依赖 confirm确认机制 配置文件
  • Python介绍

    Python由荷兰数学和计算机科学研究学会的吉多 范罗苏姆 于1990 年代初设计 作为一门叫做ABC语言的替代品 1 Python提供了高效的高级数据结构 还能简单有效地面向对象编程 Python语法和动态类型 以及解释型语言的本质 使它
  • prometheus的介绍&环境搭建配置服务启动监控

    一 prometheus的介绍 环境搭建配置 1 prometheus grafana构成 2 功能简介 Prometheus是一个开源监控系统 它前身是SoundCloud的警告工具包 主要具有如下功能 多维 数据模型 时序由 metri
  • 消息队列状态:struct msqid_ds

    Linux的消息队列 queue 实质上是一个链表 它有消息队列标识符 queue ID msgget创建一个新队列或打开一个存在的队列 msgsnd向队列末端添加一条新消息 msgrcv从队列中取消息 取消息是不一定遵循先进先出的 也可以
  • Mybatis学习

    mybatis面向接口编程 1 mybatis配置文件
  • 为什么pnpm比npm、yarn使用更好

    performant npm 意味高性能的 npm pnpm由 npm yarn 衍生而来 解决了 npm yarn 内部潜在的bug 极大的优化了性能 扩展了使用场景 被誉为 最先进的包管理工具 我们按照包管理工具的发展历史开始讲起 np
  • 转载--Windows下比较两个不同版本的二进制文件

    接手前人的软件 发现主程序依赖的动态库文件的源码没有包含在工程里面 花了好长时间找到了源代码 但是不知道它是不是最新版本的源代码 发现现有用到的动态库有两个版本的 其中一个修改时间旧一点的动态库文件在源代码的Release目录中可以找到 可
  • C# 自定义Label实现 指定字符串(关键词)高亮显示(字体、颜色)

    C 自定义Label实现 指定字符串 关键词 高亮显示 字体 颜色 原来是搞android的 本来自己就菜 现在由于项目需要开始着手弄C WPF 虽然了解一些 毕竟只是皮毛 唉 苦不堪言啊 还是得倚靠万能的互联网啊 需求 提示用户的文字 但
  • 机器学习--支持向量机(sklearn)

    机器学习 支持向量机 1 1 线性可分支持向量机 硬间隔支持向量机 训练数据集 T x 1 y 1 x 2 y 2 x N y N 当 y i 1 y i 1
  • Flutter页面不流畅,难道是使用姿势有问题?

    作者 檀婷婷 三莅 出品 阿里巴巴新零售淘系技术部 背景 高性能高流畅度一直是Flutter团队宣传的一大亮点 也是当初闲鱼选择Flutter的重要因素之一 但是随着复杂业务的应用落地 通过Flutter页面和原生页面滑动流畅度对比 我们开
  • 使用Azure Data Factory REST API和

    题解 给数组加一 class Solution public 代码中的类名 方法名 参数名已经指定 请勿修改 直接返回方法规定的值即可 题解 统计每种性别的人数 字符串子串函数的使用 substring index profile 1 SE
  • listView闪烁的问题

    用了一个ListView来实时的显示数据传输情况 于是问题就来了 当数据量比较大 而且处理速度很快时 这该死的界面闪得人眼花 废话不多说 直接上代码 首先 自定义一个类ListViewNF 继承自 System Windows Forms
  • stata 数据处理

    目录 按类别求均值 然后创建一个新的变量 缩尾处理 日期处理 连续变量处理成虚拟变量 按条件删除数据 按类别求均值 然后创建一个新的变量 bysort year industry egen meanvariable mean variabl
  • MySQL系列---事务与锁详解

    table of contents 1 背景 2 事务隔离级别 2 1 事务及其ACID属性 2 2 并发事务带来的问题 2 3 数据库事务隔离级别 3 锁机制 3 1 定义 3 2 分类 3 2 1 性能上划分 悲观乐观 3 2 2 从对
  • 解决微信小程序button的hover-class不生效问题

    在小程序开发过程中我们会遇到button添加style样式后即使添加hover class样式也没有点击效果的问题 产生该问题的原因为 在css中 内联样式style的优先级要高于class选择器的优先级 所以在我们添加style标签后即使
  • RabbitMq 报 An unexpected connection driver error occured和socket close异常处理

    进入rabbitMQ后台 1 后台地址为http localhost 15672 如果state状态为无法访问 那么我们就需要把这个链接给关掉 2 点击地址 找到close this connection 选择force close强制关闭
  • Centos7配置静态IP

    Centos7配置服务器静态IP 1 使用 ip addr 查看当前网卡信息 通过执行结果我们可以看到我们使用的网卡名称为ens33 2 配置服务器静态IP vi etc sysconfig network scripts ifcfg en
  • STL list

    文章目录 一 list 类的模拟实现 list 是一个带头双向循环链表 可以存储任意类型 模板参数 T 表示存储元素的类型 Alloc 是空间配置器 一般不用传 一 list 类的模拟实现 iterator 和 const iterator
  • 傅里叶图像相关性匹配-《医学图像处理》小作业五-Python代码/Matlab代码

    天津中医药大学 20级医学信息工程 教师 王翌 学生 邓集亲 学长我是用的python写的 matlab同样可以参考 实验五 相关性匹配 作业要求 参考 傅里叶变换 课的内容 采用快速傅里叶变换 FFT 进行相关性匹配 如下图示例输出结果图