Насколько я понимаю, стандартные методы выдают кортежи с x,y,w,h.
Дальше можно сделать бинаризацию(или выделение границ) найденных прямоугольников и поискать с помощью Хафа круги(окружности).
Да легко, при вращении через warpAffine установить BorderTypes в нужный тип.
Например:
cv.warpAffine(src, dst, M, dsize, cv.INTER_LINEAR, cv.BORDER_REFLECT, new cv.Scalar());
Тут можете потренироваться на Лене: https://docs.opencv.org/3.4/dd/d52/tutorial_js_geo...
rect := image.Rect(minX, minY, maxX, maxY)
заменить на
rect := image.Rect(minX, minY, minX+inputImg.Cols(), minY+inputImg.Rows())
или тоже самое в расчете maxX/Y
Эта идея называется вейвлет-разложением.
В частности, то что вы описываете, похоже на вейвлеты Хаара.
Вейвлеты используются, например, в jpeg2000 кодеках
Примеры редактирования картинок ("в отдельном слое можно убрать крупные морщины и прыщи, не повредив мелкую текстуру кожи") есть в Wavelet toolbox, Matlab.
Вариант1:
Расспознаем tesseract'ом в HOCR, находим в нем нужные слова и их координаты. Imagemagick'ом закрашиваем слова на сканам по координатам.
Вариант2:
Распознаем FineReader'ом, экспортируем в djvu, извлекаем из djvu текстовой слой с координатами и парсим его. Далее тоже самое с Imagemagick.
Все это можно автоматизировать скриптами.
Разобъет картинку пополам на левую и правую части.
Для Win не забудьте экранировать пути к файлам и еще, если не путаю, в новых версиях вместо convert magick.exe