需要拟合出数据点聚集的区域,由于蓝色轮廓周围的浅灰色与背景深灰色的色差
导致二值化方法会使轮廓偏移无法准确分割出想要的区域,无法进行后续的边缘检测等工作。
提取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))