企业文化

图像裁剪寻找低代价竖缝时为什么要看整条路径:机制分析第17例

2026-11-15

想从贴图中移除一条尽量不重要的竖向缝时,每行只挑最低代价格子可能无法连成连续路径。逐行记录到达每列的最小累计代价,才能兼顾连接限制和全程代价。

先明确输入与规则

本例六行五列,代价矩阵已经给出。竖缝从第一行到最后一行,每行恰好选一格,相邻行列号最多差一。某格累计代价等于自身代价加上一行可到达列中的最小累计值,同值取完整列序列字典序较小者。

本例的独立记录

六行五列,行列编号从零开始,格子代价为输入数据而非从图片自动估算。

原始代价: [11, 9, 12, 16, 11] [4, 1, 10, 19, 10] [3, 17, 6, 11, 2] [4, 10, 2, 14, 5] [20, 17, 12, 20, 13] [3, 9, 11, 17, 16] 到每格的最小累计代价: [11, 9, 12, 16, 11] [13, 10, 19, 30, 21] [13, 27, 16, 30, 23] [17, 23, 18, 30, 28] [37, 34, 30, 38, 41] [37, 39, 41, 47, 54] 最优各行列号(1, 1, 0, 0, 1, 0),总成本37。 局部贪心列号[1, 1, 0, 0, 1, 0],总成本37。

记录中的编号只用来区分本例对象,不应与大小排名或另一组记录的身份混淆。先核对单位和边界,再跟随中间值检查结果。空结果、零值与尚未确定是不同状态;分数保留精确含义,显示小数只为方便阅读。

怎样复算

输出路径必须每行有一项且列号在边界内,总代价等于沿路格子相加。局部贪心从首行最低格出发,再每行选可达的最便宜格,供比较;它可能恰好最优,也可能错过后面更便宜的通道。

先手算两行的累计表,再检查每个最优路径的前缀是否确实来自允许的上一行。即使一格自身代价很小,到达它的历史成本也可能很大;把局部代价和累计代价分别列出能避免误判。

适用条件与限制

本例只寻找一条给定代价下的路径,没有定义像素重要性怎样计算,也没有真正删除图片列。连续删除多条缝后通常需要重新考虑代价与邻接,不能把第一条缝的计算结果无限重复套用。

练习时可以一次只改变一个条件,比较差异从哪个步骤开始。若自己的结果不同,先核对是否采用同样的规则,再定位第一个不一致的中间状态,不要只修改最终答案。输入与运算过程需要一起保存,才能判断结论究竟适用于哪一个具体场景。