轻量级命令行数据库管理工具实践:dbx如何统一MySQL、PostgreSQL与Redis操作

命令行数据库管理工具MySQLPostgreSQL 本内容遵循CC 4.0 BY-SA版权协议
圣狗子 圣狗子 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要

带团队这几年,我前后换过三波数据库管理工具——最开始用 phpMyAdmin,遇到复杂的多表关联就直接卡死;后来转到 Navicat,功能确实全,但 License 按人头收费,团队一扩就心疼;再后来试过 DataGrip,重度 JVM 应用,启动慢,内存吃紧,后台挂着两个项目就觉得电脑在喘。折腾到后面,我干脆把眼光放到了命令行工具上,自己动手维护了一款叫 dbx 的轻量级数据库管理工具。它本质上是跑在终端里的数据库聚合客户端,MySQL、PostgreSQL、SQLite、Redis 都能接,一条命令完成连接、查询、导入导出、批量变更,不需要图形界面,也不需要高昂授权。

这篇文章不打算写成工具说明书,而是把我维护和使用 dbx 过程中踩过的坑、想清楚的设计逻辑、以及在真实业务场景里的实操方法全部摊开来讲。如果你是一个经常要和多种数据库打交道的后端开发、DBA,或者你也正在纠结要不要自研一套内部数据管理工具,这篇应该能给你不少参考。

1. 项目定位与整体设计思路

先说清楚 dbx 是什么,不是什么。

它是命令行下的数据库客户端聚合工具,定位是"内部研发和运维日常高频操作"的入口。它不做复杂的报表分析,不做可视化图表,也不试图取代一套完整的数据库管控平台。它只解决一个问题:当你脑子里有明确的 SQL 或操作目标时,用最快、最省资源的方式把事办了。

这个定位的由来,其实挺现实。团队日常的数据库操作里,有超过七成都是相对固定的动作:连上库、查一条数据、看下慢查询、导出一份报表、改一条状态、同步一下表结构。这些动作如果每次都打开 GUI 工具,光等启动、等连接、点菜单就要耗费不少时间。而命令行工具天然适合这类"用完即走"的场景。加上我们团队的开发机配置普遍一般,开两个 IDE 已经满头大汗,再用重型客户端属实遭不住。

1.1 给“一个人也要养全家”的工具做减法

dbx 的核心设计哲学是"克制"。

现在很多工具都在做加法,面板越来越华丽,菜单越来越深,但真正高频用到的功能也就那么几个。我在设计 dbx 时,刻意把交互收敛成四种最基本的操作:

  • 连接目标数据库,建立会话;
  • 在会话里执行 SQL,查看结果;
  • 把数据集导入导出成通用格式;
  • 对目标表做批量变更或结构同步。

一旦某个功能不在这个范围里,我就不往主程序里塞。这带来的直接好处是:安装包极小,启动时间可以忽略不计,内存占用长期稳定在几十 MB 以内。和那些动辄占用 1GB 内存的图形工具相比,体验完全不在一个层级。

还有一个容易被忽视的点:命令行工具天然适合脚本化。 图形界面你做一次点击操作,只能服务眼前这一条数据;命令行的输出可以被管道、重定向、定时任务接住,一条指令塞进 CI/CD 流程,就能在发布流水线里自动跑数据校验。这对我来说是刚需,因为团队有夜间归档任务,之前用脚本拼 MySQL 客户端原生命令,不同库的语法和参数差异大,维护成本全堆在 shell 代码里了。dbx 把连接和查询统一抽象之后,归档脚本从三百多行缩减到几十行,这个收获是当初完全没想到的。

1.2 架构上先解决的三件事

确定了定位之后,我在代码结构上优先解决三个问题,这三个问题基本决定了工具的稳定性和扩展性。

连接管理。 这是所有数据库工具的地基。不同的数据库有完全不同的握手协议、鉴权方式和连接参数。dbx 在最底层抽象了一个统一的 Connector 接口,不同类型的数据源各自实现这个接口。向上层暴露的只有 Open(connConfig) 和 Close() 两个方法,上层逻辑完全不关心背后连的是 MySQL 还是 PostgreSQL。这个设计意味着新接入一种数据库,只要新增一个 Connector 实现即可,不影响查询、导出、事务等公共逻辑。

SQL 执行引擎。 dbx 内部没有自己去解析 SQL,而是把语法解析和执行计划的重活交给了各个数据库的原生驱动。但执行引擎层做了统一的结果集抽象,无论是 MySQL 的 ResultSet 还是 Redis 的 Reply,最终都转成统一的 DataSet 结构,包含列名、行数、各单元格的类型信息。这样做最大的好处是:一旦拿到了统一的 DataSet,后面接什么输出格式都方便——终端渲染、CSV 导出、JSON 输出,全部基于这同一个结构。

安全兜底。 我在一开始就明确一条铁律:不带 --yes 确认标志的批量写操作,一律先进入 dry-run 模式。也就是说,你执行 dbx batch update ... 时,工具会先把将要影响的行数和预览数据打出来,等收到二次确认后才真正执行。后来这个机制在团队里避免了好几次灾难性事故,包括我自己有一次把 WHERE 条件写漏了,如果没这层保护,那张表基本上就回不去了。安全兜底不是靠"操作者足够小心"来实现的,而是要靠机制——工具本身默认不信任人的注意力。

2. 核心功能拆解与实操要点

接下来是重点部分。我挑 dbx 里最常用的四组能力展开讲,并给出可以直接复用的参数组合和操作习惯。

2.1 多引擎连接管理,一个会话切所有库

dbx 的连接命令统一格式是 dbx connect <engine> [options],引擎名可以是 mysql、postgres、sqlite、redis 等。连接成功后,当前终端就进入了该数据库的会话模式,提示符会带上当前库名。

以最常见的 MySQL 为例:

BASH
dbx connect mysql --host 127.0.0.1 --port 3306 --user root --password ****** --database mydb

PostgreSQL 我更喜欢用连接串的方式,更紧凑:

BASH
dbx connect postgres "postgresql://postgres:pass@127.0.0.1:5432/mydb?sslmode=disable"

SQLite 最简单,给个文件路径就行:

BASH
dbx connect sqlite ./data/app.db

Redis 则是 URL 风格:

BASH
dbx connect redis --url redis://127.0.0.1:6379/0

再说一个使用习惯:我一般会在 ~/.dbx/config.yml 里维护一份命名连接,相当于给常用库起了个"别名"。有了这些别名之后,日常操作可以再省一步,直接 dbx use db-alias 就能切过去,不用每次敲主机名和端口。

YAML
connections:
prod-mysql:
engine: mysql
host: 10.0.1.10
port: 3306
user: deploy
database: app_prod
dev-pg:
engine: postgres
url: postgresql://dev:dev@127.0.0.1:5432/app_dev

配置即是基础设施的一部分。我把这份配置文件放进团队内部仓库,新人入职后拷一份就能连上所有开发环境的数据库,不再需要逐个询问"测试库的密码是什么"这类问题。这也让我意识到,一个好的工具,应该成为团队知识沉淀的载体,而不是把信息锁在操作者的脑子里。

连接这块有几个容易踩的细节,后面避坑章节会展开,这里先提一句最重要的:能配置超时时间的连接参数,一律不要用默认值里偏长的那个。 数据库不可达时,与其让工具卡在 TCP 层等满一个超时周期(有的驱动默认 30 秒甚至更久),不如主动设成 3 到 5 秒,快速失败,尽快走容灾切换。这个对线上故障处理很关键——你能比同事早 20 秒定位到是哪台库挂了,判断依据就会更从容。

2.2 查询工作台与慢 SQL 定位

连接之后的核心操作自然是查询。dbx 有两种执行 SQL 的方式:一种是进入交互式工作台,另一种是直接通过 dbx sql 命令执行单条语句。

交互式工作台适合探索性分析,支持上下键翻历史、自动补全表名和列名。我更常用的是非交互模式,因为它能直接嵌入脚本:

BASH
dbx sql "SELECT id, name, created_at FROM users WHERE status = 1 LIMIT 5"

默认输出是对齐的文本表格,在终端里可读性很好。需要机器可解析的格式时,可以加 --format json 或 --format csv。比如查完之后直接转成 CSV 扔给后端接口做数据对接:

BASH
dbx sql "SELECT order_id, amount, pay_time FROM orders WHERE pay_time > '2025-01-01'" --format csv --output orders.csv

真正让我觉得值回票价的功能,是 dbx sql 内置的慢查询分析辅助逻辑。执行任何一条 SELECT,工具都会自动调用 EXPLAIN(MySQL 下是 EXPLAIN,PostgreSQL 也相同),然后把访问类型、扫描行数、是否用到索引这几项高亮显示,默认只使用 --explain 参数显式开启。例如:

BASH
dbx sql --explain "SELECT * FROM order_items WHERE order_id = 12345"

正常情况下你会看到 type: ref, key: idx_order_id, rows: 12,说明索引生效了。如果看到 type: ALL 和巨大的 rows,那基本可以断定这条 SQL 在线上全表扫了,再结合执行耗时,处理建议就很清晰了。

我要求团队里所有后端开发在提交代码前,对涉及查询的 SQL 至少手动跑一遍 --explain。这个动作成本极低,但对线上性能的影响是决定性的。以前经常出现的"本地一万行数据没事,线上千万行数据就卡死"的情况,多数都是因为索引没走对。有了 dbx 之后,这个检查前置到了代码提交之前,线上慢查询的数量肉眼可见地降了一个数量级。

2.3 数据导入导出与批量迁移

管理数据库,逃不开数据搬家的场景:从生产导一份数据到测试环境、把一份 CSV 灌进临时表、把旧表数据归档到冷存储。

dbx 的导入导出命令设计得比较接近直觉。导出到文件:

BASH
dbx export mysql --query "SELECT * FROM users WHERE registered_at >= '2024-06-01'" --format csv --output users_2024.csv

导出成 SQL 插入语句也一样方便:

BASH
dbx export mysql --query "SELECT * FROM legacy_categories" --format sql --output categories.sql

导入则反过来:

BASH
dbx import mysql --file users_2024.csv --table users_staging --truncate

这里必须强调一个关键参数 --truncate:它会在导入前清空目标表。这个参数的设计初衷是为了让"全量替换"场景变得可控,但它也是一把双刃剑。我在实际操作中很少直接对业务表用 --truncate,更稳妥的做法是先导入到一张临时表,验证行数和数据分布之后再通过 SQL 做原子切换。

BASH
dbx import mysql --file users_2024.csv --table users_tmp
dbx sql "SELECT COUNT(*), COUNT(DISTINCT id) FROM users_tmp"
dbx sql "RENAME TABLE users TO users_bak, users_tmp TO users"

这套流程虽然多两步,但胜在安全。特别是目标表正在被线上读写时,RENAME TABLE 属于元数据操作,耗时极短,对业务的影响远小于 TRUNCATE + INSERT。

批量变更则是另一类高频场景。dbx 支持通过 SQL 模板加参数占位符的方式执行批量操作:

BASH
dbx batch update --sql "UPDATE accounts SET status = 3 WHERE plan_expire_at < '2025-01-01' AND status = 1" --limit 500 --sleep 0.2

--limit 500 限制单批次影响行数,--sleep 0.2 每批休眠 0.2 秒。这样一句话就把"分批更新 + 控制节奏"这两个原本要写脚本的活全干了。之所以要压节奏,是因为大批量更新会持有行锁,如果一次性刷几百万行,极可能把主库的复制延迟拉高,甚至把 binlog 撑爆。分批加休眠的本质,是给主从复制和业务流量留出喘息时间。实际跑下来,批任务高峰期主库的 QPS 曲线依然平稳,完全没影响到线上正常业务的响应。

3. 真实场景中的避坑手册

工具大多数时候好用,但真正让你记住它的是踩坑的经历。这一节我把自己被坑过、以及帮团队排过的问题整理出来,每一个都对应一段真实事故或教训。

3.1 连接串与驱动层最容翻车的三个细节

第一个是 MySQL 套接字连接。早期我默认所有连接都走 TCP 127.0.0.1,结果在部分本机环境里死活连不上,后来发现 MySQL 客户端如果连的本机,默认很可能走 Unix socket 而不是 TCP 端口。dbx 后来增加了 --socket 参数显式指定,这个问题才算根治:

BASH
dbx connect mysql --socket /var/run/mysqld/mysqld.sock --user root

如果你在连接本机 MySQL 时遇到"Connection refused",优先排查是否应该走 socket,而不是死磕端口号。

第二个是 密码里的特殊字符。连接串方式下,密码中如果包含 @、:、/ 等字符,必须做 URL 编码,否则解析会错位。比如密码是 p@ss:w0rd,在 PostgreSQL 连接串里直接写就是错的,得写成 p%40ss%3Aw0rd。如果是交互式命令的 --password 参数,则建议用环境变量传入:

BASH
export DBX_MYSQL_PASSWORD='p@ss:w0rd'
dbx connect mysql --host 127.0.0.1 --user root --password-env DBX_MYSQL_PASSWORD

不要在进程列表里留下明文密码——这条适用于所有数据库工具的使用习惯,不只是 dbx。

第三个是 SSL 参数默认值不一致。PostgreSQL 和 MySQL 对 SSL 的默认行为不同:有的环境默认强制 SSL,有的则完全不启用。跨环境操作时,最怕的就是"在测试环境连得好好的,到生产环境突然报 SSL 错误"。我的建议是在连接串里显式声明 sslmode,不要依赖驱动默认值。内网环境一般 sslmode=disable 就够,公网环境则应按证书规则配置。显式声明这个习惯,帮我少排查了很多"同样的命令,换个环境就失败"的诡异问题。

3.2 字符集和时区:数据乱码的根源

字符集问题是我见过团队内部最普遍的隐形 bug,而且非常难以察觉。现象是"界面里查出来正常,但导出的 CSV 在 Excel 里打开是乱码",或者"应用日志里中文没问题,数据库存储字段却变成问号"。

dbx 在连接时会统一校验三处字符集设置:客户端字符集、连接字符集、表字符集,并且默认用 utf8mb4 而不是 utf8。这里要普及一点:MySQL 里的 utf8 是历史遗留的别名,它最多支持 3 字节编码,存 emoji 或者部分生僻汉字会直接报错;utf8mb4 才是真正的完整 UTF-8,支持 4 字节字符。从 2015 年之后,新业务一律应该用 utf8mb4,没得商量。

时区问题则更加隐蔽。MySQL 的 datetime 类型本身不带时区信息,但驱动连接时的 time_zone 参数会影响 NOW() 和 CURRENT_TIMESTAMP 的行为。之前团队有一次把生产环境的报表数据导到本地分析,发现时间全部偏了 8 小时,排查了半天,最后定位到两个环境用的连接时区参数不一致,一边是系统默认时区,一边是 +08:00。dbx 支持连接时显式指定时区:

BASH
dbx connect mysql --host 127.0.0.1 --user root --timezone "+08:00" --database mydb

我的建议是:所有跨环境的数据比对,统一约定连接时区为业务所在地的标准时区,并且在连接配置里写死,不要留给系统默认值去猜。

3.3 批量改动、大事务与主从复制

接着说批量操作,这一节值得每一个做数据订正的人反复看。

之前有同事直接用 dbx sql 跑了一条不带 LIMIT 的大范围 UPDATE。目标表有 800 万行,条件命中 200 万行。执行过程中,就听到旁边人喊"怎么线上订单支付超时了"。原因不复杂:这条大事务长时间持有大量行锁,业务写入全部被阻塞,同时主库生成的海量 binlog 传到从库后,从库回放跟不上,复制延迟飙升到几千秒。

处理这种问题的第一原则是:永远不要让一条写 SQL 影响几十万行。 后来我用 dbx batch update 重写了这个订正任务,按主键范围分批处理,每批 500 行,批间暂停 200 毫秒。结果跑完全程用了 20 多分钟,但主库负载平稳,复制延迟几乎没变化,业务无感知。线上执行批量订正,本质上是"用时间换空间"——把事情做完很重要,但更重要的是别把数据库搞挂。

另一个要注意的是主从复制延迟的验证。在大部分一主多从架构里,写完主库并不代表数据立刻在所有从库可见。我在 dbx 里加了 --sync-wait 参数,对于要求强一致的脚本场景,可以在写入后等待从库追平确认再执行下一步。用法:

BASH
dbx sql "INSERT INTO configs(k, v) VALUES('version', '2025.03.1')"
dbx sql "SELECT * FROM configs WHERE k = 'version'" --sync-wait

不是所有环境都需要这个,但如果你在写自动化脚本,后续步骤依赖刚写入的数据,这个参数能避免一半以上的"随机偶发失败"。尤其是做数据校验断言的时候,等了同步再断言,和不等同步直接断言,失败率完全是两种级别。

3.4 常见问题速查表

把上面这些经验整理成一个速查表,方便直接对照:

现象 可能原因 处理动作
连接本机 MySQL 被拒 驱动走 TCP 但实例只开 socket 改用 --socket 参数
执行 SQL 中文变问号 表或连接字符集不是 utf8mb4 统一字符集,重建相关表
导出的 CSV 用 Excel 打开乱码 CSV 无 BOM,Excel 按 ANSI 解码 导出时指定 --encoding utf8-sig
报表时间整体偏移 驱动连接时区与业务时区不一致 连接串显式声明 timezone
批量 UPDATE 卡死 单事务更新行数过大,锁堆积 改 batch update 分批执行
从库数据查不到刚写入的数据 复制延迟未追平 读操作加 --sync-wait
密码含特殊字符连不上 URL 编码缺失 对特殊字符做转义或用环境变量

这张表我直接放在团队的数据库操作规范文档里,遇到问题先查表,基本能解决八成日常问题。剩下两成,就属于"每次都不一样,需要现场推理"的疑难杂症了。

4. 性能优化与后续扩展

工具做出来只是第一步,用得顺手、跑得快、能扩展才是长期价值。这一节聊聊 dbx 性能调优的思路和下一步想补的能力。

4.1 冷热查询路径与连接的取舍

命令行工具很少被讨论性能,因为它的瓶颈通常不在工具本身,而在网络和数据库端。但在实现上,我还是做了不少细节优化,其中收益最大的是"冷热查询路径分离"。

所谓冷路径,是那些只跑一次或偶尔跑的 SQL,比如 DBA 临时排查问题。这类查询不需要任何缓存,直接下发到数据库并实时返回结果即可。

热路径则是脚本里反复执行的查询,比如数据校验任务每个周期都会跑同样的 SQL。dbx 为这些查询提供了 --cached 选项,基于 SQL 文本哈希做结果缓存,TLL 默认 60 秒。如果同一个 SQL 在 TTL 内被再次执行,就直接从本地缓存返回,不惊动数据库:

BASH
dbx sql "SELECT COUNT(*) FROM orders WHERE day = 20250310" --cached --cache-ttl 60

这个功能在处理夜间重试类脚本时特别有用——同一批数据校验因为网络波动反复重跑时,不会给数据库造成重复压力。

另一个取舍是连接池的大小。命令行工具和长驻服务不同,它执行完一条命令就退出了,如果每次都新建连接再断开,在高频调用场景下的握手开销会很可观。dbx 的解决方案是内置了一个简单连接池:在同一会话内,重复 dbx sql 会复用已有连接,避免反复握手。但连接池也不是越大越好,每个连接在 MySQL 端都是一个线程,PostgreSQL 端是一个进程,池子过大会反过来消耗数据库资源。我的经验值是单会话并发控制在 5 个以内,默认 2 个就足够日常使用。

4.2 从"够用"到"好用":插件体系与未来方向

dbx 目前的功能可以满足九成日常操作,但距离"好用"还有距离。我下一个阶段想做的事,是把它从一个内部工具升级成一个可扩展的平台。核心思路是插件化。

目前规划的插件方向有三个。

第一个是审计日志插件。把所有通过 dbx 执行的写操作都记录下来,包括执行人、时间、目标库、SQL 摘要、影响行数。这不只是满足合规要求,更重要的是出了事故能追溯——是哪条命令在什么时候改坏了数据,一目了然。审计日志不是用来追责的,是用来复盘和优化的。

第二个是脱敏策略插件。在内网开发环境用生产数据做联调测试,是很多团队躲不开的需求。直接拉全量数据有泄漏风险,脱敏规则如果每家都在脚本里自己写,格式不统一,覆盖面也有限。dbx 会在导出环节接入可配置的脱敏规则,比如手机号中间四位打码、邮箱星号化、金额字段添加随机扰动,让"拿到测试环境的数据"和"泄密"之间多一道闸门。

第三个是Web 管理界面。听上去和命令行工具的初衷矛盾,但实际的定位是:命令行保持轻快,Web 界面做成只读的查询入口,让非技术人员(比如运营和数据分析师)也能安全地查数据。只读权限、查询超时、结果集行数限制,这些在 Web 层统一管控。毕竟你不能指望全公司的人都去学 SQL 命令行,但你可以给他们提供一个安全的、受控的查询入口。

5. 写在最后的实操体会

如果只挑一条关于 dbx 的使用心得来说,我选"延迟确认"这四个字。

不管是在终端里敲批处理命令,还是在脚本里接自动化任务,我都会在关键写操作前后刻意制造一个时间窗口——执行前重新审视 WHERE 条件,执行后立刻对比影响行数和预期是否一致,不一致马上回滚。dbx 只是让这个过程变得更顺手,真正救命的还是这个习惯本身。

另外一个小技巧:给所有命名连接设置一个可辨识的提示符。 我在 dbx 的配置里为生产环境加了红色前缀的提示符,每次连接后终端都会明确显示当前处于生产环境。这个细节在深夜处理故障时极其有用——它把"当前操作的目标是什么环境"这件事变成了不可忽略的视觉信息,而不是靠脑子去记。人一旦连续处理多个环境的问题,很容易产生"上下文混淆"。有了这个提示符,至少能少犯一类「在测试库里执行了生产 SQL」的低级错误。

dbx 到现在还是一个偏个人维护的项目,但我越来越觉得,越是小的工具,越要在"克制"和"顺手"之间找到平衡。功能不加克制,迟早会变成又一个臃肿的客户端;设计不贴近真实使用场景,再强大的功能也只是纸上谈兵。如果你也有类似的内部工具需求,我的建议是从自己三个月内重复操作超过十次的动作出发,先做出解决这些动作的最小闭环,再慢慢往外延伸。工具存在的意义,是让你更安心地把注意力放在数据和业务本身,而不是放在伺候工具这件事上。

相关推荐

基于Python+Open CV的手势识别算法设计

伴随着人工智能时代的到来,人机交互的领域也逐渐成为研究的一大方向;其中,手势识别是人机交互领域的一项关键技术,自此手势识别也迎来了一波高潮,近几年无论是在消费领域、电子领域、数码领域、家电领域甚至汽车领域上,都能或多或少的见到手势识别的身影。 手势识别在设计智能高效的人机界面方面具有至关重要的作用, 目前手势识别已应用到手语识别、智能监控、到虚拟现实等各个领域,手势识别的原理都是利用各种传感器(例如红外、摄像头等)对手部的形态进行捕捉并进行建模,形成一个模型信息的序列帧,而后将这些信息序列转换为机器能够识别的相对应指令(例如打开、切换菜单、移动等)来完成控制。 采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库(模块)的下载,调取电脑摄像头,按帧读取摄像头采集到的头像,形态学处理,图像旋转(由于摄像头采集到的图像是镜像,需要用cv2.flip将摄像头采集到的图像进行处理),选取图片中固定位置作为手势输入,用红线画出手势识别框,基于hsv的肤色检测,进行高斯滤波,找出轮廓,求出图像中手势的凹凸点,手指间角度求取。

努力学习前端的小陈

ROS-CV-ImageConverter:将ROS图像转换为OpenCV(cv :: Mat)类型的图像

ROS-CV图像转换器 依存关系 cv_bridge(ROS软件包)

Willis Wang

计算机视觉图像处理-CV2与图像插值算法

用最近邻插值与双线性插值原理完成图像缩放 最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输。缺点:使用最近邻插值算法处理图像放大时,在图象中可能出现明显的块状效应 双线性插值,在两个方向上做三次线性插值。使用双线性插值算法处理图像放大时,在图象中可能出现马赛克 代码 import cv2 img = cv2.imread(’./xiabang.jpg’, cv2.IMREAD_UNCHANGED) #缩放比例 scale_percent = 0.3 width = int(img.shape[1] * scale_percent) height = int

weixin_38697274

基于水平集CV模型的图像分割(Matlab代码)

基于水平集CV模型的图像分割(Matlab代码),全套代码

小宇QAQ

导向滤波(guide_filter)的python实现

导向滤波(guide_filter)的python实现,可以结合暗通道;理论实现比较好的图像去噪效果。

zachzhan_g
返回顶部
圣狗子
博客等级 码龄10年 40粉丝 2,517原创