我有一个 X 射线图像数据集,我试图通过旋转图像来清理它,使手臂垂直并裁剪任何多余空间的图像。以下是数据集中的一些示例:

我目前正在研究计算 X 射线角度并以此为基础旋转图像的最佳方法。
我目前的方法是使用霍夫变换检测扫描所在的矩形边的线,并以此为基础旋转图像。
我试图在精明的边缘检测器的输出上运行霍夫变换,但这对于矩形边缘像第一张图像一样模糊的图像效果不佳。
我不能使用 cv 的框检测,因为有时扫描周围的矩形有一个边缘离开屏幕。
所以我目前使用自适应阈值来找到框的边缘,然后对其进行中值滤波并尝试在其中找到最长的线,但有时错误的线是最长的,并且图像被旋转完全错误。
由于某些扫描具有不同的亮度,因此使用了自适应阈值。
我目前的实现是:
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)
并产生以下结果:

出错时:

我想知道是否有任何更好的技术可以使用以提高性能,以及在旋转图像后裁剪图像的最佳方法是什么?
心有法竹
青春有我
幕布斯6054654
随时随地看视频慕课网APP
相关分类