基于opencv的数据轮廓拟合填充

  • 遇到的问题:

基于opencv的数据轮廓拟合填充_第1张图片

需要拟合出数据点聚集的区域,由于蓝色轮廓周围的浅灰色与背景深灰色的色差

导致二值化方法会使轮廓偏移无法准确分割出想要的区域,无法进行后续的边缘检测等工作。

  • 解决办法:

提取roi颜色,后续进行图像形态学处理,准确分割区域后边缘检测,并进行颜色填充。

import cv2 as cv
import numpy as np
import copy


def roiflood(src, hsv_lower, hsv_upper, dilatekernal, erodekernal, contourColor, contourthick, roiColor):
    src = cv.imread(src)
    hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
    lower_hsv = np.array(hsv_lower)
    upper_hsv = np.array(hsv_upper)
    mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
    cnt = copy.deepcopy(src)
    rof = copy.deepcopy(src)
    area = cv.dilate(mask, cv.getStructuringElement(cv.MORPH_RECT, dilatekernal))
    out = cv.erode(area, cv.getStructuringElement(cv.MORPH_RECT, erodekernal))
    contours, heriachy = cv.findContours(out, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        cv.drawContours(cnt, contours, i, contourColor, contourthick)
    for i, contour in enumerate(contours):
        cv.drawContours(rof, contours, i, roiColor, -1)
        for i, contour in enumerate(contours):
            cv.drawContours(rof, contours, i, contourColor, contourthick)

    cv.imshow('image', src)
    cv.imshow('area', area)
    cv.imshow('cnt', cnt)
    cv.imshow('rof', rof)
    cv.waitKey(0)


roiflood('./1.png', [100, 43, 46], [124, 255, 255], (17, 17), (19, 19),
         (0, 255, 0), 3, (0, 0, 255))
  • Result:

基于opencv的数据轮廓拟合填充_第2张图片

你可能感兴趣的:(Opencv,图像处理,python,opencv,图像识别)