从MySQL到TDSQL:分布式数据库架构、迁移实战与避坑指南
我见过太多团队从 MySQL 迁到分布式数据库之后,第一反应是:“这玩意儿怎么连 join 都这么费劲?”也有人问:TDSQL 不就是把 MySQL 外面包了一层分库分表中间件吗?自己用 MyCat 也能搭,为什么要买腾讯云的账?这两种想法,说对了一半,也说错了一大半。
TDSQL 是腾讯云推出的企业级分布式数据库产品,核心卖点就是 MySQL 兼容、水平扩展、强一致高可用。它真正解决的,是单机数据库在数据容量、并发能力、容灾能力三个方向上同时逼近极限时,靠“加机器、做主从、拆库表”这些土办法已经兜不住底的问题。我这次就从实际使用者的视角来拆一拆 TDSQL 的架构逻辑、关键技术点,以及迁移落地时常见的坑。正在做选型的技术负责人、被分库分表整到头疼的运维、还有课程设计或毕业设计里想研究分布式数据库的同学,看完应该能少走一点弯路。
1. 为什么说 TDSQL 不是“MySQL 套了个分布式壳”
1.1 先看单机数据库逼近极限时发生了什么
先不聊产品,聊一个真实的业务场景。假设你负责的电商系统上线时用的是 4C8G 的单机 MySQL,日订单量 1 万,数据量 50G,一切安好。过了两年业务翻了十倍,日订单到 10 万,数据量到 500G,这时候问题不是一个个来的,而是一起来:
- 容量层面:500G 的表做一次
ALTER TABLE加字段,耗时已经长到需要半夜停机维护; - 性能层面:单机连接数打到上限,慢查询堆积,主库负载飙到 80% 以上,读写分离缓解不了写放大;
- 可用性层面:主库一旦宕机,主从切换要人工介入,半同步复制配置不当甚至可能丢几百毫秒的 binlog;
- 备份层面:1T 以上的数据库做全量备份,恢复时间随容量线性增长,SLA 里根本填不上 RTO 数字。
这个时候你觉得“分库分表吧”,于是引入中间件,把订单表按用户 ID 拆分到 32 个库。刚开始确实有效果,但紧接着就会出现中间件方案的新问题:跨分片的 join 写不了,分布式事务没有统一方案,全局唯一主键要额外引入发号器,扩容时手动搬数据能让你加班一个月。我在另一个项目里见过,分库分表做到中期,光是一张订单明细表的导出需求,就要写 32 条 SQL 循环去跑,跑完再在内存里合并。这种体验,经历过的人应该都懂。
1.2 中间件方案为什么是“半个解决方案”
这里不是说 MyCat、ShardingSphere 这类中间件不好,很多场景下它们确实能用,但要注意它们和原生分布式数据库的一个本质区别:中间件做的是“路由转发”,它本身不参与数据存储和事务执行,所以它很难做到下面几件事:
- 无法完整保证跨分片事务的一致性。事务状态分散在各个分片,中间件如果挂了,全局事务状态就断了;
- 无法自动处理数据再平衡。扩容往往意味着手工搬迁数据,搬数据的过程还得锁表或者接受短暂不一致;
- 无法感知每个分片的主从状态。高可用逻辑还是得靠底层 MySQL 自己,中间件只是负责把流量打到某个节点上;
- SQL 支持度全看中间件的解析能力。换一条复杂 SQL 可能就是一次新的挖坑。
而 TDSQL 的做法,是把分布式这个属性直接做进引擎和调度层。用户通过类似 MySQL 的连接方式访问集群时,实际请求会被接入层解析、改写、路由到正确的分片,事务的全局状态由管控节点统一维护,数据分布和副本状态由集群管理系统自动处理。对应用层来说,它看到的是一个“大 MySQL”,对底层来说,它是一组有明确分工的机器,这跟“在外面套一层壳”有本质区别。
1.3 TDSQL 的定位:把分布式做进引擎,把 MySQL 兼容露在外面
所以我的理解是,“TDSQL 兼容 MySQL”这个说法要精确地拆成两层看:
- 协议和语法层:它兼容 MySQL 的 wire protocol、常用 SQL 语法、JDBC 驱动、主流 ORM 框架,这让存量应用改造成本大幅下降;
- 架构层:它和单机 MySQL 的物理模型完全不同。数据会被水平拆到多个分片,每个分片保留多副本,SQL 可能只路由到单个分片,也可能被分发到多个分片再汇总。
这也是为什么很多人刚接触 TDSQL 时最大的困惑:明明连上去是 MySQL,为什么有些 SQL 就是跑不了?其实就是因为你还没意识到自己在用分布式数据库。理解了这层,你才知道建表要指定分片键、跨节点操作要掂量成本、事务要控制范围。这些不是 TDSQL 的缺点,而是分布式数据库本身的固有脾气,只不过 TDSQL 把 MySQL 的熟悉感留给了你,让你更容易上手,也更容易在初期低估它的复杂性。
2. TDSQL 的架构拆解:数据到底拆到哪、怎么保证一致
2.1 接入层:你连接的是集群,不是一台 MySQL
TDSQL 的对外形态是一个集群,集群前面有接入层,或者叫代理/接入网关,应用连接的就是接入层暴露的地址。这个设计的价值在于:分片拓扑的变化对应用透明。比如集群从 4 个分片扩到 8 个分片,应用侧连接串不用变,新路由规则由接入层自动更新。这一点比中间件方案舒服太多——用 MyCat 的时候,扩容往往要改一遍路由配置再重启,中间件节点如果成了单点,还要再想想怎么给它做高可用。
接入层还顺带做了连接管理、鉴权、限流这些事情。做运维时,你可以在控制台上看到连接数、QPS、慢 SQL 统计,这些信息就是接入层和各节点汇总上来的。所以排查性能问题,第一步不是冲进某个分片去 explain,而是先看接入层把 SQL 路由到了哪些分片。如果一条本该走单分片的查询被广播到了所有分片,那问题很可能出在 SQL 没带分片键,而不是节点性能不行。
2.2 分片与全局表:数据在集群里怎么分布
再往下就是核心问题:数据怎么放。TDSQL 支持水平拆分,建表时可以指定分片键,官方 DDL 里常见的是类似 dbpartition by hash(字段) 的写法,引擎根据分片键的哈希值把数据路由到不同的物理分片。比如订单表用 user_id 做分片键,那么同一个用户的订单一定落在同一个分片上,这样根据用户维度的查询就不需要跨分片,这也是大多数交易系统最自然的查询模式。
有几种表需要单独说明:
- 分片表:数据按分片键散列到多个分片,适用于数据量大、写入并发高的核心业务表;
- 全局表,也叫广播表:每个分片都存一份全量数据,适用于字典表、配置表、地区表这类小表。它的作用很实在:当订单表 join 一个字典表时,字典表在每个分片都有副本,join 能在本地完成,不用跨分片拉数据。
设计表结构的时候,全局表和分片表的搭配是门学问。我见过有人把所有表都设成全局表,结果每个分片都存了一份全量数据,数据量一大就把存储撑爆了;也见过把地区字典表设成普通分片表,结果每次 join 都跨分片,查询慢到怀疑人生。正确做法一般是:大表选分片表,分片键必须选查询和写入都高频的字段;小字典表选全局表;两个分片表之间的关联,尽量让关联字段做成分片键,保证数据落在同一组分片上,这样 join 才不会被广播到整集群。
2.3 强同步复制:RTO 和 RPO 的平衡怎么打
企业级数据库绕不开“高可用”三个字。TDSQL 的高可用,不是传统主从那种“异步复制”的将就能用,而是支持强同步复制:事务在主分片提交时,要确认至少一个备分片收到了日志,主备都落盘了才返回成功。这么做的收益很直接:主节点宕机时,备节点能直接顶上,数据可以做到零丢失,RPO 几乎可以看作为 0。
代价也显而易见:每次写入的延迟会变高,因为多了一次网络往返和备机刷盘。但对企业核心系统来说,这个代价是值得的——宁可单次写入多个几毫秒,也不能接受灾难恢复时丢一笔交易。还有,强同步复制对网络质量非常敏感,如果主备分片跨机房部署,带宽和延迟都要提前测好,不然业务高峰时复制链路会拖慢整体写入。
故障切换这块,TDSQL 的集群管理组件会监控各节点状态,主节点异常时自动把最新最全的备节点提拔为主节点,应用侧连接会自动重连。我实际用下来,切换时间通常能控制在几十秒级别,但前提是应用代码要做好连接池的自动重试,否则数据库切换好了,应用连接池还没反应过来,照样会给你报一堆连接异常。这个问题在压测和真实故障演练里都要提前暴露出来。
3. 分布式事务、分布式锁、分布式 Join:这几块硬骨头不好啃
3.1 分布式事务:跨分片写一致是怎么保证的
分布式数据库最容易被吐槽的就是跨分片事务。TDSQL 提供了全局事务机制,保证跨多个分片的写操作要么全部提交、要么全部回滚。原理上可以理解为,全局协调节点来主导事务提交,流程上本质遵循两阶段提交的思路。开发者在代码里用 START TRANSACTION 发起事务,跨分片写入时会被自动纳入全局事务管理,对业务代码来说相对透明。
但透明不代表免费。一个跨两个分片的事务,提交时要经历多分片协调、日志同步、状态确认,耗时比单分片事务多不少。所以实际开发中要养成一个习惯:能不跨分片就不跨分片。把订单主表和订单明细表设计成同一个分片键,让它们落到同一个分片上,那这笔交易的所有写操作就都是本地事务,根本不需要全局事务插手。我们团队在压测时对比过,同样的下单流程,单分片事务比跨分片事务能快一个量级,这个差距不是靠数据库调优能追回来的,只能在表结构设计阶段规避。
3.2 分布式锁:秒杀、防重、定时任务这类场景怎么办
既然聊到分布式了,顺手说一个被问烂的问题:分布式锁。很多人习惯用 Redis 的 SETNX 做分布式锁,这没问题,但也有另一条路:直接用数据库做分布式锁。TDSQL 作为 MySQL 兼容的分布式数据库,你可以用 SELECT ... FOR UPDATE 对一条锁记录加锁,拿到锁之后执行业务,COMMIT 后释放。好处是锁状态和业务事务天然绑定——事务提交锁就释放,事务回滚锁也释放,不会出现“Redis 锁过期了业务还没跑完”这种经典问题。代价是数据库要承受额外的锁等待,高并发抢锁时对数据库压力比较大。
我的经验是:能用 Redis 扛瞬时并发的场景,比如秒杀入口、接口防重,先用 Redis 拦掉大部分流量,数据库只做最终落库和资源扣减;而对那些必须和业务强一致、允许串行的场景,比如分布式定时任务防止多个节点同时执行同一个任务,用 TDSQL 的行锁或者 MySQL 兼容的 GET_LOCK() 来做就很稳。需要提醒一下,在 TDSQL 里用行锁做分布式锁时,要注意锁记录所在的分片,尽量用固定分片键把锁记录定位到同一个分片,否则跨分片加锁的行为会让锁的有效性和复杂度都变得很难控制。
3.3 跨分片查询与分布式 Join:划算和不划算的写法
跨分片查询是分布式数据库的一个老话题。TDSQL 不是完全不能跨分片查询,而是跨了之后性能不可控。比如订单表按 user_id 分片,你想按 order_no 查一条订单,如果 SQL 没有把 order_no 和 user_id 一起带上,引擎就得把查询广播到全部分片,每个分片查一遍再合并结果,这种操作叫分散查询。数据量小的时候没问题,分片一多、数据一大、并发一高,广播查询就是灾难。
在 TDSQL 上写 SQL,我建议遵循几条原则:
- 查询条件尽量带上分片键,让 SQL 能落到单分片执行;
- 分片表之间的 join 尽量用同一个分片键做等值关联,这样 join 可以在分片本地完成,不需要跨节点搬数据;
- 分片表和全局表的 join 是安全的,因为全局表在每个分片都有副本;
- 避免跨分片的大表 join 和复杂子查询,必要时改为在应用层分多次查出来再合并。
这不是 TDSQL 独有的限制,所有分布式数据库都有类似约束。设计阶段就把“按什么查”定清楚,把常用查询路径和分片键对齐,比事后在慢 SQL 上反复优化靠谱得多。
3.4 弹性伸缩:扩缩容会不会打断业务
企业选分布式数据库,很大程度是冲着“扩缩容不中断”去的。TDSQL 支持在集群运行中增加分片节点,新节点加进来之后,系统会自动把部分数据搬迁到新分片上,完成负载均衡。在控制台看,就是一次容量变更,底层迁移任务会被调度器拆成很多小任务逐个完成,应用侧基本无感。
但我要提醒一点:无感不等于零风险,也不等于无限快。扩缩容期间的数据搬迁会占用一部分磁盘 IO 和网络带宽,所以在业务高峰期做扩容,性能下降是能感觉到的。我一般会在业务低峰期操作,并且在扩容前把磁盘空间、慢 SQL、主备延迟这些指标都捋一遍,确认集群状态健康再动手。扩容完之后也别急着走,最好观察至少一个完整的业务周期,确认数据分布均匀、路由正确、没有出现新的热点分片。
4. 和 MySQL、Oracle、达梦、开源中间件比,TDSQL 的位置在哪
4.1 与 MySQL 主从/组复制方案比:一致性维度差了一层
很多团队现在的标配是 MySQL 主从,或者用 Group Replication / MGR 做多副本。说实话,这套方案在数据量和并发量还没到变态水平的场景下挺能打,成本低、社区活跃、网上踩坑经验到处都是。但它有个先天短板:它是在“一个单机数据库外面搭复制”,并没有解决单库本身的容量和写入瓶颈。主库的磁盘、CPU、内存一旦到顶,加再多的从库也只是解决了读,写不上去就是写不上去。MGR 虽然改善了高可用,但写入节点的压力和扩展性依然受限。
TDSQL 这类分布式数据库把写能力也水平扩展了,这是本质区别。分片多了以后,写入流量可以被分摊到多个分片并行处理,这才是“分布式”真正的价值。代价是部署更重、链路更复杂,不是一个小团队随随便便拉台机器就能玩转的。它更适合本身有一定运维力量、业务增长确定、愿意为扩展性长期投入的企业。
4.2 与 Oracle RAC、达梦数据库比;国产数据库替代里的差异
聊 TDSQL 经常绕不开国产数据库替代这个背景,这个背景下有两个经常被拿来对比的对手,一个是 Oracle RAC,一个是达梦这类偏集中式的国产数据库。
Oracle RAC 是典型的“共享存储 + 多实例”架构,多台服务器共享一套存储,优点是稳定、成熟,但扩展性受限于存储层,而且 Oracle 的授权费用在 X86 和云原生时代显得越来越贵。TDSQL 走的是 share-nothing 架构,每台机器只管自己的数据分片,扩展靠加机器和重新分布数据,理论上能接近线性扩展。这就是为什么在国产化改造中,不少金融客户最后选了 TDSQL——它不只是“换个 Oracle”,而是把架构的扩展性也一起换了。
达梦数据库我也接触过 DM8,它确实在 SQL 语法和 Oracle 兼容性上花了不少功夫,但本质上更偏传统集中式数据库,支持集群方案,可分布式能力、弹性扩展和云化部署跟 TDSQL 不是一个路数。如果核心诉求是把 Oracle 存量业务平滑迁到国产数据库、保持集中式架构不变,达梦可能更对口;如果新业务要云原生部署、要水平扩展、要应对互联网量级的分布式事务,TDSQL 的分布式基因优势就更明显。别一听到“国产数据库”就把它们混为一谈,选型还是要回到具体场景。
4.3 与 MyCat、ShardingSphere 等中间件方案比:运维心智完全不同
这个话题在前面提过多次,这里直接做个对比。中间件方案适合“已有 MySQL 集群、想低成本引入分片能力、团队有能力驾驭开源组件”的情况。但它要求团队同时维护中间件集群、底层 MySQL 多副本、数据迁移脚本、全局唯一 ID 生成器这一整套零件,相当于把一个单体系统的复杂度拆成了无数个需要自己拼装的组件。TDSQL 把这些都收拢成一个托管产品了,接入即用,控制台点点鼠标就能看到集群健康度、慢 SQL、备份状态。
| 维度 | TDSQL | MyCat/ShardingSphere + MySQL | MySQL 主从/MGR |
|---|---|---|---|
| 水平扩展 | 原生支持,自动均衡 | 支持,但扩容手工成本高 | 仅扩展读,写有瓶颈 |
| 跨分片事务 | 引擎级全局事务 | 中间件层能力参差 | 不涉及,单库内事务 |
| 高可用 | 内置强同步复制 | 依赖底层 MySQL 自身 | 半同步/异步 |
| 运维复杂度 | 托管服务,控制台运维 | 组件多,链路复杂 | 中等 |
| 适用阶段 | 中大业务/核心交易 | MySQL 老手团队扩展 | 中小业务起步 |
这张表不是要说中间件一无是处,而是帮你快速判断自己适合走哪条路。如果团队里都是 MySQL 老手,又不想迁移到腾讯云生态,中间件方案完全够用;如果不想在基础设施上投入太多精力,希望把数据库的运维复杂度交出去,托管形态的 TDSQL 会更合适。
5. 什么场景该上 TDSQL、什么场景千万别凑热闹
5.1 典型的适配场景:金融交易、电商订单、政企数字化系统
从我接触过的项目来看,TDSQL 的典型用户画像有三类。第一类是金融行业核心系统,比如银行账户、保险保单、支付清结算。这类系统对强一致、高可用、审计合规的要求极高,数据量又是逐年几倍地涨,传统集中式数据库要么扛不住,要么贵到离谱。第二类是电商交易系统,订单、库存、优惠券这些核心表天然适合按用户维度拆分,和 TDSQL 的分片模型很贴合。第三类是政企数字化系统,既要国产化合规,又希望部署在云资源池里,TDSQL 在腾讯云生态里和 CVM、COS、安全产品的整合比较顺滑。
这类场景有个共同点:数据是核心资产,不能丢;并发和存储会持续增长;业务不能因为数据库停机而长时间中断。说白了,就是“钱和数据安全”比“省一点卡费”重要得多。
5.2 从 MySQL 迁移 TDSQL 的真实路径
存量系统迁移,最怕的不是迁移动作,而是迁移之后发现 SQL 行为不一样。TDSQL 提供了迁移评估工具,可以扫描源库的慢 SQL 和对象 DDL,输出兼容性评估报告。我的经验是:迁移之前,先把业务里的 SQL 全量捞出来,对着报告过一遍。重点关注这几类:
- 不带分片键的查询,要看是否会被广播,评估查询频率和开销;
- 跨分片 join、子查询、
LOCK TABLES、存储过程、触发器、外键,在分布式环境下要么不支持,要么行为不同; - 大事务、长事务,平滑迁移之前最好先治理一轮。
迁移本身推荐用官方 DTS 工具做在线迁移,理论上可以不停业务。但切流那一刻还是要安排好灰度方案:先切读流量,再切写流量,最后做全量数据校验。别一上来就全量切换,回滚可比迁移痛苦十倍。
5.3 千万别凑热闹的场景:小项目、AP 分析、KV 缓存
没有到那个量级,就别硬上分布式。我见过有人用户表才 2 万行、单库 10G 不到的创业项目,也非要上一个分布式集群,结果就是徒增运维成本,而且因为链路变长,单条 SQL 的延迟反而比单机 MySQL 更高。分布式数据库的时延并不比单机快,它的优势在吞吐、容量和扩展性。数据量小、并发低、响应要求极高的业务,老老实实用单机 MySQL 加适当缓存就好。
另外,TDSQL 本质是 OLTP 交易型数据库,不是分析型数据库。数据仓库、BI 报表、复杂聚合分析,应该交给 ClickHouse、StarRocks 或者专门的数据仓库产品去做。还有人把大文件直接塞进数据库,这也是个坑,非结构化的大文件应该扔到对象存储,比如腾讯云 COS 或者自建的 minio,数据库里只留对象路径就行。KV 缓存、Session 这类数据,用 Redis 更合适,没必要让数据库来背这个负载。
6. 实操中容易踩的坑:分片键、长事务、监控
6.1 分片键选错之后的顿悟
分片键是 TDSQL 里最影响命运的一个决定。选对了,一切顺畅;选错了,数据分布歪斜,热点分片被打爆,查询广播,性能崩塌。
我见过一个反面案例:某系统把订单表的分片键定成了 create_time,理由是“按时间分片方便清理历史数据”。结果线上所有查询都是按用户维度查订单,每次都要广播到所有分片扫一遍。更要命的是,新订单的时间戳集中在每天的同一个时段,本来应该平均分布在 16 个分片里的数据,几乎全部写到了当前时间对应的那一两个分片上,热点分片磁盘暴涨,其他分片完全闲置。
分片键的选择一定要看真实的查询和写入模式:高频查询条件是哪个字段,高频写入的并发是否分散。一般来说,用户 ID、商户 ID、设备 ID 这类高基数字段比时间戳靠谱得多,因为天然离散。时间戳更适合做二级索引里的排序字段,而不是分片键。
6.2 长事务和跨分片事务:性能杀手
第二个坑是事务习惯。单机 MySQL 时代,很多人开发时不把事务当回事,一个接口里开启事务,中间调外部接口、查询几十次、循环更新几百条数据,反正单库扛得住。到了分布式数据库,这会变成大问题:
- 长事务会持有资源锁,把同分片上的其他事务全部堵住;
- 跨分片长事务,全局事务协调的成本更高,任何一个参与分片抖动,整个事务都会被拖垮。
我在团队里定的规矩比较朴素:事务尽量短小;事务内只做必要的写操作,复杂查询放到事务外;读写分离场景下,事务内的读一定要走主库,避免读到旧数据;能拆成单分片事务的,绝不写成跨分片事务。这些规矩看起来简单,但经过几次生产事故之后,团队里每个人都会发自内心地遵守。
6.3 监控与日常巡检:DBA 和 DevOps 要盯什么
最后聊几句运维。TDSQL 有控制台监控,但我建议再往上叠一层业务视角的监控。日常巡检我主要盯这几个指标:
- 分片数据分布:有没有某个分片磁盘使用率明显偏高,说明分片键或全局表设计可能有问题;
- 主备延迟和强同步状态:延迟异常要么是复制链路问题,要么是大事务拖垮了日志同步;
- 慢 SQL 聚合:按分片维度看哪些 SQL 被广播了,哪些走了跨分片 join,定期梳理优化;
- 连接数:分布式集群的连接数耗尽时表现很诡异,应用那边报一堆连接超时,数据库看着却只显示部分节点连接高,实际上是被接入层限流了。
另外,备份恢复别只信自动化。我建议定期做一次真实的恢复演练,挑一个测试库,把最近的备份恢复到一台临时实例上,对比数据一致性和关键表的行数。有些问题不会在日常监控里暴露,只会在灾难降临时突然出现,恢复演练是你能买到的最便宜的保险。
这篇文章不是劝所有人都上 TDSQL。我自己在实际项目里的体会是,能单机就尽量单机,但业务一旦过了单机数据库的天花板,与其自己用中间件拼出一个四处漏风的方案,不如认真评估 TDSQL 这样的成熟托管产品。如果你正在做选型,我的建议是别光看产品文档,拿真实的业务表和 SQL 跑一次兼容性评估,让开发同学先按分布式设计的思路改一轮表结构,再小范围实测一段时间,最后才决定要不要全面铺开。系统迁移这种事,没有标准答案,只有适配度,多一轮实测,就少一次深夜故障。
相关推荐
基于Python+Open CV的手势识别算法设计
伴随着人工智能时代的到来,人机交互的领域也逐渐成为研究的一大方向;其中,手势识别是人机交互领域的一项关键技术,自此手势识别也迎来了一波高潮,近几年无论是在消费领域、电子领域、数码领域、家电领域甚至汽车领域上,都能或多或少的见到手势识别的身影。 手势识别在设计智能高效的人机界面方面具有至关重要的作用, 目前手势识别已应用到手语识别、智能监控、到虚拟现实等各个领域,手势识别的原理都是利用各种传感器(例如红外、摄像头等)对手部的形态进行捕捉并进行建模,形成一个模型信息的序列帧,而后将这些信息序列转换为机器能够识别的相对应指令(例如打开、切换菜单、移动等)来完成控制。 采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库(模块)的下载,调取电脑摄像头,按帧读取摄像头采集到的头像,形态学处理,图像旋转(由于摄像头采集到的图像是镜像,需要用cv2.flip将摄像头采集到的图像进行处理),选取图片中固定位置作为手势输入,用红线画出手势识别框,基于hsv的肤色检测,进行高斯滤波,找出轮廓,求出图像中手势的凹凸点,手指间角度求取。
ROS-CV-ImageConverter:将ROS图像转换为OpenCV(cv :: Mat)类型的图像
ROS-CV图像转换器 依存关系 cv_bridge(ROS软件包)
计算机视觉图像处理-CV2与图像插值算法
用最近邻插值与双线性插值原理完成图像缩放 最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输。缺点:使用最近邻插值算法处理图像放大时,在图象中可能出现明显的块状效应 双线性插值,在两个方向上做三次线性插值。使用双线性插值算法处理图像放大时,在图象中可能出现马赛克 代码 import cv2 img = cv2.imread(’./xiabang.jpg’, cv2.IMREAD_UNCHANGED) #缩放比例 scale_percent = 0.3 width = int(img.shape[1] * scale_percent) height = int
基于水平集CV模型的图像分割(Matlab代码)
基于水平集CV模型的图像分割(Matlab代码),全套代码
导向滤波(guide_filter)的python实现
导向滤波(guide_filter)的python实现,可以结合暗通道;理论实现比较好的图像去噪效果。

