这是我初步的 hacky 解决方案:
from PIL import Image
import numpy as np
class Pic_Function():
    def __init__(self, picture_path):
        self.picture = Image.open(picture_path)
        self.pixels = self.picture.load()
        self.columns = []
        # is there really no image method to get a numpy array of pixels?
        for i in range(self.picture.size[0]):
            self.columns.append([self.pixels[i,j] for j in range(self.picture.size[1])])
        self.first_black = []
        for i in self.columns:
            try:
                self.first_black.append(self.picture.size[0] - i.index((0,0,0)))
            except ValueError:
                self.first_black.append(None)
        self.max, self.min = max(self.first_black), min([j for j in self.first_black if j != None])
    def at(self, x):
        upper_idx = int(math.ceil(x))
        lower_idx = upper_idx - 1
        try:
            upper = self.first_black[upper_idx]
            lower = self.first_black[lower_idx]
        except IndexError:
            return 0
        if None in [upper, lower]:
            return 0
        up_weight, low_weight = abs(upper-x), abs(lower-x)
        return (up_weight*upper + low_weight*lower)/(up_weight + low_weight)
    def norm_at(self, x, length):
        un_normed = self.at(x*self.picture.size[0]/length)
        return (un_normed - self.min)/self.max