如何提取高分辨率图像中的对象?
How to extract object in high resolution images?
我有一张通过 DSLR 相机拍摄的封闭图像,但也可以看到放置对象的背景。我想从背景中裁剪对象。图片大小为(3456,5184,3)
示例图片:
我尝试了多种可用的解决方案,即。使用 openCV 方法,例如使用 grabcut 进行前景提取、图像阈值化和掩蔽、边缘检测,但结果不尽如人意。
请提出正确的方法。
这是使用阈值+轮廓提取的方法
- 灰度然后高斯模糊
- Otsu 的二值图像阈值
- 扩张以连接成单个轮廓
- 使用 numpy 切片提取 ROI
转换为灰度和高斯模糊后,我们大津的阈值
现在我们有了所需的白色前景对象,因此我们扩大以连接轮廓以形成单个轮廓
最后我们得到边界框坐标并提取ROI
import cv2
# Grayscale, Blur, Otsu's threshold then dilate
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,25))
dilate = cv2.dilate(thresh, kernel, iterations=3)
# Extract ROI
x,y,w,h = cv2.boundingRect(dilate)
ROI = image[y:y+h, x:x+w]
cv2.imshow('thresh', thresh)
cv2.imshow('dilate', dilate)
cv2.imshow('ROI', ROI)
cv2.waitKey()
我有一张通过 DSLR 相机拍摄的封闭图像,但也可以看到放置对象的背景。我想从背景中裁剪对象。图片大小为(3456,5184,3)
示例图片:
我尝试了多种可用的解决方案,即。使用 openCV 方法,例如使用 grabcut 进行前景提取、图像阈值化和掩蔽、边缘检测,但结果不尽如人意。
请提出正确的方法。
这是使用阈值+轮廓提取的方法
- 灰度然后高斯模糊
- Otsu 的二值图像阈值
- 扩张以连接成单个轮廓
- 使用 numpy 切片提取 ROI
转换为灰度和高斯模糊后,我们大津的阈值
现在我们有了所需的白色前景对象,因此我们扩大以连接轮廓以形成单个轮廓
最后我们得到边界框坐标并提取ROI
import cv2
# Grayscale, Blur, Otsu's threshold then dilate
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25,25))
dilate = cv2.dilate(thresh, kernel, iterations=3)
# Extract ROI
x,y,w,h = cv2.boundingRect(dilate)
ROI = image[y:y+h, x:x+w]
cv2.imshow('thresh', thresh)
cv2.imshow('dilate', dilate)
cv2.imshow('ROI', ROI)
cv2.waitKey()