裁剪X射线图像,去除黑色背景。

问题描述 投票:0回答:1

我想从X射线中去除背景以提取实际区域。所以我的原 Original Image 图像看起来像左边的图像,我想裁剪成类似于 To be image 图像。

感谢使用Python和Open-CV的解决方案。

有多个文件,所以我们不知道高度和宽度要。提前进行裁剪。所以需要计算。

python image opencv computer-vision crop
1个回答
1
投票

这里有一种方法可以在PythonOpenCV中实现。

  • 读取输入
  • 转换为灰色
  • 阈值
  • 把下面两行白字涂黑
  • 查找图像中所有白色像素的位置
  • 获取这些像素的边界
  • 在边界处裁剪图像
  • 保存结果

输入。

enter image description here

import cv2
import numpy as np

# load image as grayscale
img = cv2.imread('xray_chest.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold 
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
hh, ww = thresh.shape

# make bottom 2 rows black where they are white the full width of the image
thresh[hh-3:hh, 0:ww] = 0

# get bounds of white pixels
white = np.where(thresh==255)
xmin, ymin, xmax, ymax = np.min(white[1]), np.min(white[0]), np.max(white[1]), np.max(white[0])
print(xmin,xmax,ymin,ymax)

# crop the image at the bounds adding back the two blackened rows at the bottom
crop = img[ymin:ymax+3, xmin:xmax]

# save resulting masked image
cv2.imwrite('xray_chest_thresh.jpg', thresh)
cv2.imwrite('xray_chest_crop.jpg', crop)

# display result
cv2.imshow("thresh", thresh)
cv2.imshow("crop", crop)
cv2.waitKey(0)
cv2.destroyAllWindows()

阈值图像,底部两行变黑。

enter image description here

裁剪后的输入。

enter image description here

另一种方法是从阈值图像中得到白色区域的外部轮廓。获取轮廓的边界。然后裁剪到这些边界。


0
投票

你可以使用numpy slicing来裁剪图像。

import cv2
IMAGE = "img.jpg"
img = cv2.imread(IMAGE)
crop_img = img[y:y+h, x:x+w]

// y = start height
// y + h = end of height 
// x = start width
// x + q = end width

cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
© www.soinside.com 2019 - 2024. All rights reserved.