【Opencv–实现抠图】求出连通区域所占的矩形框
1. 需求和方法
1.1 需求
本项目所要扣的物体是裂缝,也适用于其他的物体目标。
1.2 方法
- 先对图像进行二值化;
- 再对图像求连通区域(Opencv–API);
- 挑选最大的连通区域位置(原图像0位置除外);
- 对该连通区域进行保存。
2. 先验知识
3. 代码实现
import cv2
import numpy as np
def getRec(img):
img2 = img.copy()
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# 可能存在断的裂缝,存在多个连通区域,此时进行膨胀操作
img = cv2.dilate(img, kernel, 3)
# 求黑白图像中的连通区域
_, _, stats, _ = cv2.connectedComponentsWithStats(img, connectivity=8)
img1 = np.zeros_like(img)
a = [s[-1] for s in stats[1:]]
a = np.array(a)
# 选择最大的连通区域,作为裂缝区域
ind = np.argmax(a) + 1
# 存储裂缝区域的外接矩形
x, y, h, w = stats[ind][0], stats[ind][1], stats[ind][2], stats[ind][3]
img1 = img2[y:y+w, x:x+h]
return img1
img_name = 'a.jpg'
img = cv2.imread("image/ori/" + img_name, 0)
img1 = getRec(img)
cv2.imwrite('image/final/'+ img_name, img1)