【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)


4. 前后效果

4.1 原图像

4.2 处理后


阅读量:1231

点赞量:0

收藏量:0