Matlab一键Matlab代码转python代码详细教程
Posted 小丫么小阿豪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab一键Matlab代码转python代码详细教程相关的知识,希望对你有一定的参考价值。
Motivation
博主最近在看的一篇做biomedical image SR的论文,其对数据的预处理用matlab做的…要在集群上跑的话还要重新配环境装matlab,总觉得不太舒服…于是就想干脆把他的matlab代码转成python代码好了。
matlab2python工具
在网上查工具的时候发现中文博客(基本都是抄的)在推荐一个叫SMOP的工具。博主亲测这个工具配置问题比较大…配置完成之后还是用不了。查了一下,大概意思是这个工具好像要python2的环境。emmmmmmmmmmmmm,感觉有点坑,于是放弃了。
换了一个叫matlab2python
的工具,亲测简单易上手
安装使用
- 安装:
如果有朋友不能翻墙clone不下来代码,把上面第一行命令换成:git clone https://github.com/ebranlard/matlab2python cd matlab2python pip install -r requirements.txt
git clone https://gitee.com/zongfang/matlab2python.git
- 使用:
在matlab2python目录下输入
注意:file.m如果不指定位置就是当前目录下的,如果要用别的目录下的文件,需要指定路径。python matlab2python.py file.m -o file.py
问题
工具只能转换一些基本语法,实际估计大多数情况下转换完应该还是没办法直接用的。转换完还是要自己人工检查调整一下。
2022年3月19日更新:亲测这个工具只能大概转一下,很多的函数都没办法转,如果是图像处理之类的代码只能做一个大概的参考,没办法转完直接用。
参考:https://www.pythonpool.com/convert-matlab-to-python/
与matlab里面 imadjust 函数相同的python代码
正在做一个把matlab程序转python的工作,遇到 matlab里面的 imadjust 函数,但是找了一圈没有对应的python函数,需要自定义一个函数
import numpy as np
from bisect import bisect_left
# 已测试完毕,成功
def imadjust(src, tol=1, vin=[0, 255], vout=(0, 255)):
# src : input one-layer image (numpy array)
# tol : tolerance, from 0 to 100.
# vin : src image bounds
# vout : dst image bounds
# return : output img
assert len(src.shape) == 2, \'Input image should be 2-dims\'
tol = max(0, min(100, tol))
if tol > 0:
# Compute in and out limits
# Histogram
hist = np.histogram(src, bins=list(range(256)), range=(0, 255))[0]
# Cumulative histogram
cum = hist.copy()
for i in range(1, 255): cum[i] = cum[i - 1] + hist[i]
# Compute bounds
total = src.shape[0] * src.shape[1]
low_bound = total * tol / 100
upp_bound = total * (100 - tol) / 100
vin[0] = bisect_left(cum, low_bound)
vin[1] = bisect_left(cum, upp_bound)
# Stretching
scale = (vout[1] - vout[0]) / (vin[1] - vin[0])
vs = src - vin[0]
vs[src < vin[0]] = 0
vd = vs * scale + 0.5 + vout[0]
vd[vd > vout[1]] = vout[1]
dst = vd
return dst
src是一个二维矩阵,数据类型为uint8(0-255,用来表示灰度值),测试结果和matlab基本一模一样。做到了同输入同输出。
用到了 bisect_left 它的用法可以参考 python:从整数列表(数组)中获取最接近给定值的数字
当然,最好看文档 bisect — 数组二分查找算法,讲的比较好
以上是关于Matlab一键Matlab代码转python代码详细教程的主要内容,如果未能解决你的问题,请参考以下文章