You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:53:14