Поиск повернутых объектов?
Как-то так делал (через питоний биндинг к OpenCV):

def how_to_make_horizontal(contour):
    """ Returns rotate center and angle that would make contour horizontal """
    rect = cv.BoundingRect(contour)
    box = cv.MinAreaRect2(contour)

    x, y, w, h = rect
    p1, p2, angle = box
    if angle > 45:
        angle -= 90
    if angle < -45:
        angle += 90
    rotate_center = x+w/2, y+h/2
    return angle, rotate_center


Но у меня в задаче из растра предварительно контур удавалось получить, обработав изображение через cv.MorphologyEx с кастомным ядром (чтоб избавиться от дефектов — закрыть разрывы и тд) и натравив cv.FindContours. Вроде можно просто взять все точки и передать их в cv.MinAreaRect, не знаю. См.

opencv.willowgarage.com/documentation/cpp/imgproc_structural_analysis_and_shape_descriptors.html#cv-minarearect
Я бы попробовал так: Взяв граничную область (где присутствуют разные по цвету пиксели) можно найти направление градиента/заливки. Иллюстрация, чтобы было понятней: habrastorage.org/storage2/e77/b42/392/e77b42392bce4c4b73b70e4ec8c4057f.png
Вооружившись этим знанием можно проанализировать все граничные области, а суммой найденных направлений и будет (теоретически) искомый угол поворота. В вашем случае для этого будет достатчно одного прохода пиксельного шейдера. Однако следует учесть что из-за двоичного формата фаших образцов будут значительные погрешности.