我有一个 X 射线图片数据库,我想对其进行图像分类 - 我想要:
- 识别(不完美)矩形块的旋转
- 旋转图像,使其处于垂直方向(肖像)形式)
- 通过裁剪剩余的黑色空间来删除,以便仅保留骨头的实际照片
我不完全确定如何最好地解决这个问题,这似乎是有人已经解决的问题。 我尝试了几件事,但似乎没有一个完全有效 - 因为有些图片被旋转,有些没有,有些有清晰的白色轮廓,而另一些则没有,所以结果非常不一致。
示例图像附在下面:
想对 X 射线图像进行预处理以进行图像分类,这是一项常见且重要的任务。 识别旋转、校正对齐方式和裁剪图像对于提高模型的准确性至关重要,尤其是在存在变化的情况下。 以下是解决问题的分步方法以及要考虑的代码示例:
1. 导入必要的库
import cv2
import numpy as np
from scipy.ndimage import rotate
2. 加载图像并预处理
def load_and_preprocess(image_path):
"""加载图像并应用基本预处理。"""
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
img = cv2.GaussianBlur(img,(5,5),0)
return img
-
转换为灰度:
X 射线图像通常是灰度图像,因此加载图像时使用
cv2.IMREAD_GRAYSCALE
。 - 降噪: 高斯模糊等技术有助于减少噪声并改善后续处理步骤的结果。
3. 检测旋转并旋转图像
def rotate_image(img):
"""检测图像中骨骼结构的主要旋转并旋转图像。"""
# 应用边缘检测(例如,Canny)
edges = cv2.Canny(img, 50, 150)
# 使用霍夫变换检测线
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
# 如果检测到线
if lines is not None:
# 计算所有检测到的线的平均角度
angles = []
for line in lines:
rho, theta = line[0]
angles.append(np.degrees(theta))
average_angle = np.mean(angles)
# 旋转图像以校正旋转
img = rotate(img, average_angle, reshape=False)
return img
-
边缘检测:
cv2.Canny
等算法突出显示了图像中的边缘,这对于识别骨骼结构的边界很有帮助。 - 霍夫变换: 霍夫变换是一种强大的技术,即使线段不连续,也可以检测图像中的线。
- 计算旋转角: 通过分析检测到的线的角度,可以估计图像的旋转。
-
图像旋转:
scipy.ndimage.rotate
函数允许旋转图像以校正对齐方式。
4. 裁剪图像
def crop_image(img):
"""裁剪图像以去除多余的黑色空间。"""
# 查找非黑色像素的坐标
rows, cols = np.where(img != 0)
# 处理没有找到非黑色像素的情况(例如,完全黑色的图像)
if len(rows) == 0 or len(cols) == 0:
return img
# 使用这些坐标找到最小和最大行和列
min_row, max_row = min(rows), max(rows)
min_col, max_col = min(cols), max(cols)
# 裁剪图像
cropped_img = img[min_row:max_row+1, min_col:max_col+1]
return cropped_img
- 查找非黑色像素: 通过查找像素值不为 0 的像素,我们可以识别图像中骨骼结构占据的区域。
- 确定裁剪边界: 非黑色像素的最小和最大行和列值定义了裁剪区域的边界。
- 裁剪图像: 使用这些边界从原始图像中提取相关区域。
5. 将其全部放在一起
def preprocess_xray(image_path):
"""加载、预处理、旋转和裁剪 X 射线图像。"""
img = load_and_preprocess(image_path)
img = rotate_image(img)
img = crop_image(img)
return img
6. 在的图像上测试
processed_img = preprocess_xray('your_image_path.jpg')
cv2.imwrite('processed_image.jpg', processed_img)
此流水线提供了对齐和裁剪 X 射线图像的稳健起点。 但是,可能需要根据的特定数据集和可能遇到的挑战对此流水线进行微调。 例如:
- 图像质量: 对于低对比度或噪声很大的图像,可能需要更强大的预处理技术来增强骨骼结构的可视性。
- 旋转检测: 如果骨骼结构非常复杂或霍夫变换无法提供准确的旋转估计,可能需要探索其他算法或使用霍夫变换参数。
- 裁剪: 可能需要微调裁剪算法以考虑特定于的数据的因素,例如所需的边距或识别骨骼结构和要移除的背景之间的最佳阈值。
请记住,这只是一个起点,并且在处理图像时可能需要进行一些迭代和实验,以获得最佳结果。
标签:python,opencv,machine-learning,image-processing,python-imaging-library From: 78818523