如何在python中使用Matlab的imresize

2023-11-22

我正在转移Matlab的imresize代码写入Python。我找到了 scipy 的imresize,但我从 Matlab 得到了不同的结果。

如何通过python得到与Matlab相同的结果。

Python/scipyimresize

from scipy.misc import imresize
import numpy as np

dtest = np.array(([1,2,3],[4,5,6],[7,8,9]))
scale = 1.4
dim = imresize(dtest,1/scale)

Matlab imresize

dtest = [1,2,3;
         4,5,6;
         7,8,9];
scale = 1.4;
dim = imresize(dtest,1/scale);

这两段代码返回不同的结果。


The scipy.misc.imresize功能对我来说有点奇怪。一方面,这就是当我指定您提供给 a 的示例 2D 图像时发生的情况scipy.misc.imresize以 1.0 的比例调用此图像。理想情况下,它应该给你相同的图像,但我们得到的是这样的(在 IPython 中):

In [35]: from scipy.misc import imresize

In [36]: import numpy as np

In [37]: dtest = np.array(([1,2,3],[4,5,6],[7,8,9]))

In [38]: out = imresize(dtest, 1.0)

In [39]: out
Out[39]: 
array([[  0,  32,  64],
       [ 96, 127, 159],
       [191, 223, 255]], dtype=uint8)

它不仅将输出的类型更改为uint8, 但它scales价值观也是如此。一方面,看起来它使图像的最大值等于 255,最小值等于 0。MATLAB 的imresize不这样做,它会按照我们期望的方式调整图像大小:

>> dtest = [1,2,3;4,5,6;7,8,9];
>> out = imresize(dtest, 1)

out =

     1     2     3
     4     5     6
     7     8     9

但是,您需要认识到 MATLAB 执行调整大小默认启用抗锯齿功能。我不知道什么scipy.misc.resize在这里做,但我敢打赌没有启用抗锯齿功能。

编辑 - 2016 年 11 月 23 日

正如 Eric 在下面的评论中指出的,如果您将图像预先转换为所需的类型,您将获得预期的结果:

In [10]: dtest = np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=np.uint8)

In [11]: out = imresize(dtest, 1.0)

In [12]: out
Out[12]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]], dtype=uint8)

我们可以看到图像没有缩放到[0,255]范围。为了最终到达您需要去的地方,我们必须获得图像的浮点表示。scipy.misc.imresize有一个额外的标志称为'mode'你可以将其指定为'F'以确保输出为浮点型。

In [14]: scale = 1.4

In [15]: out = imresize(dtest, 1/scale, mode='F')

In [16]: out
Out[16]: 
array([[ 2.5 ,  3.75],
       [ 6.25,  7.5 ]], dtype=float32)

正如您稍后将看到的,您看到的结果scipy.misc.resize与您在 MATLAB 中看到的不匹配。

为了获得最佳结果,请勿指定比例 - 指定目标输出大小以重现结果。像这样,1/scale在你的情况下接近2 x 2大小输出,因此您可以在 MATLAB 中执行以下操作:

>> dtest = [1,2,3;4,5,6;7,8,9];
>> out = imresize(dtest, [2,2], 'bilinear', 'AntiAliasing', false)

out =

    2.0000    3.5000
    6.5000    8.0000

您可以看到矩阵中的某些值与scipy.misc.resize。与您在 MATLAB 中看到的内容相符。最接近你想要的是 OpenCV 的resize函数,或 scikit-image 的resize功能。这两个都没有抗锯齿功能。如果想让 Python 和 MATLAB 相互匹配,请使用双线性插值方法。imresizeMATLAB 中默认使用双三次插值,而且我知道 MATLAB 使用自定义内核来执行此操作,因此如果您在方法之间使用双三次插值,匹配它们的输出将会更加困难。请参阅这篇文章以获得更多信息的结果:

MATLAB vs C++ vs OpenCV - imresize

使用 Python OpenCV:

In [93]: import numpy as np

In [94]: import cv2

In [95]: dtest = np.array(([1,2,3],[4,5,6],[7,8,9]), dtype='float')

In [96]: out = cv2.resize(dtest, (2,2))

In [97]: out
Out[97]: 
array([[ 2. ,  3.5],
       [ 6.5,  8. ]])

使用 scikit 图像:

In [100]: from skimage.transform import resize

In [101]: dtest = np.array(([1,2,3],[4,5,6],[7,8,9]), dtype='uint8')

In [102]: out = resize(dtest, (2,2), order=1, preserve_range=True)

In [103]: out
Out[103]: 
array([[ 2. ,  3.5],
       [ 6.5,  8. ]])

最后一件有趣的事情是,MATLAB、OpenCV 和 scikit-image 在指定浮点比例时的行为彼此不同。我做了一些实验,通过指定浮点大小,我无法获得匹配的结果。除此之外,scikit-image 不支持采用比例因子,这更有理由明确说明输出大小而不是比例。

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

如何在python中使用Matlab的imresize 的相关文章

随机推荐

  • Pyinstaller,NameError:未定义全局名称“退出”

    我有一个运行良好的 python 脚本 但是运行 pyinstaller 后 当我使用quit or exit 命令 制作规范文件 mode python a Analysis os path join HOMEPATH support m
  • 在 bash 脚本中使用正则表达式将 1 个参数拆分为 2 个参数

    这是我的情况 目前 我有一个接受两个参数的脚本 书名和章节名称 例如 myscript book1 chap1 现在 由于需要很长时间来解释的原因 我希望我的脚本能够采用以下格式的单个参数 书名 章节名称 例如 myscript book1
  • Javascript 将无序列表转换为多列

    在 良好支持的 CSS 中似乎没有一种简单的方法可以做到这一点 我正在寻找一个 javascript 解决方案 最好是 jQuery 我有一个像这样的无序列表 ul li A li li B li li C li li D li li E
  • 如何在向下滚动时缩小导航菜单?

    对于我正在开发的新网站 我希望在用户向下滚动时缩小导航菜单 类似于您在 IBM 站点上看到的内容 http www ibm com us en 我找不到任何 jQuery 实现或教程 我确信我一定是搜索了错误的关键字 因此 如果有人能为我指
  • 用于解析 Latex 或 MathML 字符串的 Java 或 scala 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要将大量方程和数学公式存储到数据库中进行模拟实验 我认为最好使用一些 mathML 或乳胶字符串 但是 我提出了一些谷歌搜索请求 我非常惊讶 因
  • #1221 - UPDATE 和 ORDER BY 的错误使用

    为了绕过我在其他线程中发布的问题 我尝试了这样的sql语句 UPDATE user u JOIN SELECT i 0 r SET user rank planets i i 1 WHERE user active 1 ORDER BY u
  • 在保存对象之前处理文件上传

    我有一个这样的模型 class Talk BaseModel title models CharField max length 200 mp3 models FileField upload to u talks max length 2
  • F# 中不可变

    我知道 F 中的变量默认是不可变的 但是 例如在 F 交互式中 gt let x 4 val x int 4 gt let x 5 val x int 5 gt x val it int 5 gt 所以 我将 4 分配给 x 然后将 5 分
  • R knit:是否可以在不同机器上使用缓存结果?

    问题已解决 详情请参阅答案 我想运行一些代码 使用knitr 在更强大的服务器上 然后也许有可能在我自己的笔记本电脑上进行一些小的更改 即使复制整个文件夹 本地重新编译时似乎也会重建缓存 有没有办法避免这种情况并实际使用缓存中的结果 更新
  • 使用视图模型与在视图本身中使用 @Binding 时如何使用绑定?

    State and Binding工作得很好SwiftUI 只要将所有视图的数据放入其自身内部 如下所示 struct ColorView View Binding public var isBlue Bool var body some
  • 解决 Django 1.9.2 中的 ValidationError: [u"'' 值的日期格式无效。它必须采用 YYYY-MM-DD 格式。"]?

    早些时候 我创建了两个字段并迁移了所有内容 之后我尝试添加三个字段title about birthdate进入模型 我创建了一个这样的模型 from future import unicode literals from django u
  • 一个 ASP.Net 页面中存在多个 reCAPTCHA

    是否可以在一种形式中添加多个 reCAPTCHAS 我尝试这样做 甚至给多个 reCAPTCHAS 不同的 ID 但是当我在浏览器中加载页面时 只显示其中一个 这是设计使然吗 我需要两个 reCAPTCHAS 因为一个用于登录 另一个用于注
  • 更改日期的打印格式而不将其转换为字符

    With a DateR中的对象 是否可以选择与默认不同的打印格式 Y m d 同时保持其Date班级 这format 函数将其转换回character string I start with a character string and
  • 防止 onbeforeunload 在任何情况下关闭页面

    我想防止浏览器在任何情况下或在其他情况下关闭页面 防止浏览器在以下情况下执行任何操作onbeforeunload叫做 这是我尝试过的代码 function var proxied window onbeforeunload window o
  • Mysql 创建具有多个外键的表,删除时设置为 null

    我正在尝试创建一个具有删除 更新约束的多个外键的数据库 但我收到错误代码 1005 其中包含以下 sql 脚本 CREATE TABLE Worker WorkerID smallint auto increment WorkerType
  • 如何使用 Renderscript 模糊效果而不出现伪影?

    背景 有很多地方 包括here 来展示如何使用 Renderscript 来模糊图像 如下所示 TargetApi VERSION CODES JELLY BEAN MR1 public static Bitmap renderScript
  • 使用 std430 限定符进行内存分配

    我正在使用与 SSAO 绑定的计算着色器 我在计算着色器中使用以下结构 struct Particle vec4 pAnds vec3 velocity float lifespan float age layout std430 bind
  • PHP 密码验证总是返回 false [重复]

    这个问题在这里已经有答案了 我正在使用 PHP 的密码哈希 API 来哈希并验证我正在构建的网站上的密码 但是每当我尝试验证我的密码时 它总是返回 false 我有一个 User 类 它在将密码插入数据库之前设置密码 public func
  • 如何启用表单上的所有控件?

    目前 我在启动时禁用了表单的大部分控件 因为在加载文件之前您无法使用它们 然而 一旦文件被加载 控件就应该被启用 我正在使用绑定 但我认为它们不是一个好的解决方案 其一 这是不必要的复杂性 其次 你不能对所有事情都使用绑定 例如 MenuS
  • 如何在python中使用Matlab的imresize

    我正在转移Matlab的imresize代码写入Python 我找到了 scipy 的imresize 但我从 Matlab 得到了不同的结果 如何通过python得到与Matlab相同的结果 Python scipyimresize fr