图像缺失曲线段修复技术问询:贝塞尔曲线优化需求
低分辨率图像缺失曲线段的自然修复方案需求
我拥有若干低分辨率图像,因数据采集存在不一致性,部分图像出现可通过底部水平线检测识别的缺失曲线段,希望实时用合理曲线修复该缺失段。
示例输入图像:

遗憾的是无法上传实际尺寸图像,若需测试可留言,我将尝试提供numpy数组格式的数据。
已尝试方案
- 采用贝塞尔曲线修复缺失段,取水平段的端点作为P₀和P₃
- 通过以下代码计算交点P₁:
public static Coordinate<Integer> pointofIntersection(List<Coordinate<Integer>> line1, List<Coordinate<Integer>> line2) { var m1 = (line1.get(1).row - line1.get(0).row) / (line1.get(1).col - line1.get(0).col); var m2 = (line2.get(1).row - line2.get(0).row) / (line2.get(1).col - line2.get(0).col); var c1 = line1.get(0).row - m1 * line1.get(0).col; var c2 = line2.get(0).row - m2 * line2.get(0).col; m2 = m2==0?-1:m2; m1 = m1==0?1:m1; var slope_diff = (m1 - m2)==0?1:(m1-m2); var x = (c2 - c1) / slope_diff; var y = m1 * x + c1; var slope_ratio = Math.abs((float)m1/(float)m2)>1?Math.pow(Math.abs((float)m1/(float)m2),0.5):Math.pow(Math.abs((float)m1/(float)m2),2); x = (int) (x/ slope_ratio); return new Coordinate<Integer>(y, x); }
- 得到P₁后,估算贝塞尔曲线的第四个控制点P₂为P₃与P₁连线的中点,并设置
P₂.y = P₁.y - 计算完四个控制点后,通过以下代码生成贝塞尔曲线:
public List<Coordinate<Integer>> generateBezierPath4Points(ArrayList<Coordinate<Integer>> controlPoints, int segments) { ArrayList<Coordinate<Integer>> pointsForReturn = new ArrayList<Coordinate<Integer>>(); float t = 0; for (int i = 0; i < segments; i++) { Coordinate p = new Coordinate(-1,-1); var x = ((1-t)*(1-t)*(1-t)* controlPoints.get(0).col)+ (3*(1-t)*(1-t)*t*controlPoints.get(1).col) + (3*(1-t)*t*t*controlPoints.get(2).col) + (t*t*t*controlPoints.get(3).col); var y = ((1-t)*(1-t)*(1-t)* controlPoints.get(0).row)+ (3*(1-t)*(1-t)*t*controlPoints.get(1).row) + (3*(1-t)*t*t*controlPoints.get(2).row) + (t*t*t*controlPoints.get(3).row); Double r = Math.ceil(y); Double c = Math.ceil(x); p.row = r.intValue(); p.col = c.intValue(); t += 1.0f / segments; pointsForReturn.add(p); } return pointsForReturn; }
当前结果


期望效果
当前生成的曲线有时凸度过大,希望修复后的缺失段更自然,类似手动绘制的红色填充曲线效果:
现寻求优化方案以实现该自然曲线修复效果。
内容的提问来源于stack exchange,提问作者Shen
相关产品推荐
相关产品推荐

