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

  • 遇到的问题:

在这里插入图片描述

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

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

  • 解决办法:

提取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:

在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python中,OpenCV(Open Source Computer Vision Library)是一个广泛使用的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。当你想要从图像中检测并拟合圆形时,可以使用OpenCV中的`cv2.HoughCircles()`函数。这个函数使用霍夫变换来查找图像中的圆形轮廓。 下面是基本步骤: 1. **读取和预处理图像**: 使用`cv2.imread()`加载图像,然后可能需要进行灰度化(`cv2.cvtColor()`)或者二值化处理(`cv2.threshold()`)以便更好地识别圆形。 2. **应用霍夫变换**: ```python method = cv2.HOUGH_GRADIENT # 或者 cv2.HOUGH_PROBABILISTIC, cv2.HOUGH_TOP dp = 1 # 阈值参数 minDist = 10 # 圆心之间的最小距离 param1, param2 = 50, 30 # Hough变换参数,通常需要调整以获得最佳结果 minRadius, maxRadius = 0, 0 # 可能需要根据具体图像调整圆的尺寸范围 circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius) ``` 3. **解析结果**: 如果`circles`不是一个空列表,那么它将是一个二维数组,每个元素包含三个值:(x, y, radius),分别代表圆心的像素坐标和半径。你可以用这些信息在原始图像上画出圆形。 4. **绘制圆**: ```python if circles is not None: circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(image, (x, y), r, (0, 255, 0), 2) # 绘制绿色圆环,第二个参数是填充颜色 ``` 5. **显示结果**: ```python cv2.imshow("Detected Circles", image) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值