如何用OpenCV在小鼠X光图像中提取胸廓轮廓?
提取小鼠X光图像胸廓轮廓的解决方案
当然可以仅提取胸廓轮廓,结合你现有的代码,我们可以通过轮廓筛选+掩码限制+自适应阈值的组合方式实现,以下是具体调整方案:
关键思路
你的当前代码提取的是整个小鼠身体轮廓,要分离胸廓,需要先锁定身体区域避免背景干扰,再利用胸廓(骨骼区域)与身体其他软组织的灰度差异,精准提取胸廓轮廓。
调整后的完整代码
import cv2 as cv import numpy as np # 读取图像并转为灰度图 img = cv.imread("sample.jpg") gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 第一步:提取小鼠身体轮廓,生成身体掩码 gray_gauss = cv.GaussianBlur(gray, (9, 9), 0) # 反转阈值,因为X光中身体区域灰度更低(偏暗) ret, thresh_body = cv.threshold(gray_gauss, 130, 255, cv.THRESH_BINARY_INV) # 只提取最外层轮廓,找到面积最大的身体轮廓 contours, _ = cv.findContours(thresh_body, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) max_body_contour = max(contours, key=cv.contourArea) # 创建身体掩码,仅保留身体区域 body_mask = np.zeros_like(gray) cv.drawContours(body_mask, [max_body_contour], -1, 255, thickness=cv.FILLED) # 第二步:在身体区域内提取胸廓 # 用掩码过滤背景,只保留身体部分的灰度图 body_gray = cv.bitwise_and(gray, gray, mask=body_mask) # 自适应阈值分离胸廓(骨骼区域灰度更低) chest_thresh = cv.adaptiveThreshold(body_gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2) # 形态学闭运算填补胸廓内部小空隙,让轮廓更完整 kernel = np.ones((5, 5), np.uint8) chest_thresh = cv.morphologyEx(chest_thresh, cv.MORPH_CLOSE, kernel) # 第三步:提取胸廓轮廓并绘制 chest_contours, _ = cv.findContours(chest_thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 筛选面积最大的轮廓作为胸廓 target_chest_contour = max(chest_contours, key=cv.contourArea) # 在原图上绘制红色胸廓轮廓 cv.drawContours(img, [target_chest_contour], -1, (0, 0, 255), 2) # 显示结果 cv.imshow("Chest Contour", img) cv.waitKey(0) cv.destroyAllWindows() # 计算胸廓面积(可选) chest_area = cv.contourArea(target_chest_contour) print(f"胸廓面积:{chest_area} 像素")
注意事项
- 如果你的图像灰度特征和示例有差异,可以调整自适应阈值的块大小(比如把11改成15)或常数项(把2改成3)
- 形态学核的大小可以根据图像分辨率调整,分辨率高就适当调大
- 固定阈值的数值(130)也可以根据实际图像微调,确保能准确提取身体轮廓
内容的提问来源于stack exchange,提问作者Red Parrot
相关产品推荐
相关产品推荐

