Android文字基线(Baseline)算法

引言

Baseline是文字绘制时所参照的基准线,只有先确定了Baseline的位置,我们才能准确的将文字绘制在我们想要的位置上。Baseline的概念在我们使用TextView等系统控件直接设置文字内容时是用不到的,但是如果我们想要在Canvas画布上面绘制文字时,Baseline的概念就必不可少了。
我们先了解一下Android中Canvas画布绘制文字的方法,如下图:
Android绘制文字方法参数.png

参数示意:

  • text,文字内容
  • x,文字从画布上开始绘制的x坐标(Canvas是一个原点在左上角的平面坐标系)
  • y,Baseline所在的y坐标,不少人已开始以为y是绘制文字区域的底部坐标,其实是不正确的,这是两个概念
  • paint,画笔,设置的文字的大小颜色等属性
    了解了文字绘制的方法,我们现在就了解一下这个参数y(Baseline)的计算方法。
Baseline的概念

我们先看一行文字各区域的分布示意图
文字区域示意图.png
从上图来看,Baseline不难理解,它就是E和h的下边界线。我们还可以得出一个结论,文字的高度=Descent+Ascent
然而,上面这个公式并不完全准确,我们再看一个图:

### 基线校正算法概述 #### 自适应迭代加权惩罚最小二乘法 (airPLS) 在光谱分析、信号处理和化学计量学等领域,基线校正是一个至关重要的步骤。airPLS(自适应迭代加权惩罚最小二乘法)算法因其独特的优势而受到广泛关注。此算法能够在不依赖于用户预设条件的情况下自动完成精确的基线校正工作。具体而言,airPLS通过迭代调整拟合基线与原始信号间的误差平方和权重,并基于之前的结果动态更新这些权重,以此展现出快速且高效的基线估算性能[^1]。 ```python import numpy as np from scipy import sparse from scipy.sparse.linalg import spsolve def airpls(signal, lambda_=50, p=0.05, itermax=100): m = signal.size E = np.ones(m) w = np.ones(m) D = sparse.csc_matrix(np.diff(np.eye(m), 2)) H = lambda_ * D.T.dot(D) for i in range(itermax): W = sparse.diags(w, 0, shape=(m, m)) C = sparse.identity(m) + H.dot(W) z = spsolve(C, w*signal) d = signal - z dn = d[d<0].mean() pos_mask = (d>dn).astype(int) neg_mask = (d<=dn).astype(int) w_new = p*neg_mask + (1-p)*pos_mask if np.abs(w_new-w).sum() < 1e-3: break w = w_new return z ``` #### NMR 谱自动基线校正方法 一种针对核磁共振(NMR)谱提出的新型自动基线校正方案,在继承和发展已有技术如BRCI和AIMA的基础上进行了创新性的改进。这项新技术不仅有效解决了非线性失真状况下基线模型建立难题,而且能够充分利用峰值区域内数据信息来进行更加精准可靠的基线修正操作。实验验证显示,这种方法对于存在显著偏差问题的NMR图样可以取得令人满意的矫正效果[^2]。 #### 中位数法 中位数法则提供了一种简单直观的方式来估计基线水平。该方法的核心思路是从所有观测值构成序列中选取位于中间位置的那个作为代表值——即所谓的“中位数”。当面对含有大量噪声干扰或是分布不对称的数据集时,相较于平均值而言,这种策略往往更能反映真实背景趋势而不受极端异常点的影响。因此,在某些特定场景里,中位数法不失为一种稳健有效的选择[^3]。 #### 橡皮筋基线校正(Rubberband Baseline Correction) 橡皮筋基线校正是一种基于插值理论的技术手段,旨在构建一条尽可能贴近实际变化规律却又不会穿越任何测量样本之上的连续曲线作为参考基准。通常做法是先识别出若干关键转折部位形成支撑节点,再借助适当类型的函数表达形式将它们依次相连起来得到最终形态。由于整个过程类似于拉伸一根具有弹性的带子使之贴附物体表面的过程,故得名“橡皮筋”。 ```matlab function baseline = rubber_band_baseline(x, y) % RUBBER_BAND_BASELINE Performs Rubber Band Baseline correction on the input spectrum. % % BASELINE = RUBBER_BAND_BASELINE(X,Y) returns a vector containing the estimated baseline. npts = length(y); if npts ~= length(x) error('Input vectors must be of equal size.'); end % Find local minima and maxima points to use as anchor points for interpolation [min_val,min_idx] = findpeaks(-y,'MinPeakHeight',min(y)); [max_val,max_idx] = findpeaks(y); all_points = sort([min_idx; max_idx]); unique_points = unique(all_points); baseline = interp1(unique_points,y(unique_points),1:npts,'linear','extrap'); end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值