У меня есть набор данных рентгеновских изображений, которые я пытаюсь очистить, повернув изображения так, чтобы рука была в вертикальном положении и обрезав изображение любого лишнего пространства. Вот несколько примеров из набора данных:
В настоящее время я разрабатываю лучший способ определить угол рентгеновского снимка и повернуть основанное на этом изображение.
Мой нынешний подход заключается в том, чтобы обнаружить линию стороны прямоугольника, в которой выполняется сканирование, с использованием преобразования Хафа, и повернуть изображение на основе этого.
I попытался выполнить грубое преобразование на выходе детектора контуров, но это не очень хорошо работает с изображениями, где край прямоугольника размыт, как на первом изображении.
Я не могу использовать определение поля cv, как иногда прямоугольник вокруг скана имеет край от края экрана.
Так что в настоящее время я использую адаптивный порог, чтобы найти край поля, а затем отфильтровать его по медиане и попытаться найти самую длинную строку в этом, но иногда неправильную линию является самым длинным, и изображение полностью поворачивается неправильно.
Адаптивный порог используется из-за того, что соевые сканы имеют разную яркость es.
Текущая реализация, которую я имею:
def get_lines(img):
#threshold
thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 15, 4.75)
median = cv2.medianBlur(thresh, 3)
# detect lines
lines = cv2.HoughLines(median, 1, np.pi/180, 175)
return sorted(lines, key=lambda x: x[0][0], reverse=True)
def rotate(image, angle):
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2)
M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY
return cv2.warpAffine(image, M, (nW, nH))
def fix_rotation(input):
lines = get_lines(input)
rho, theta = lines[0][0]
return rotate_bound(input, theta*180/np.pi)
и дает следующие результаты:
Когда что-то идет не так:
Мне было интересно, есть ли какие-нибудь лучшие методы, которые можно использовать для улучшения производительности этого и как лучше всего на go об обрезке изображений после их поворота будет?