躺躺11 2022-05-29 17:00 采纳率: 60%
浏览 244
已结题

opencv-python边缘检测与拟合

问题遇到的现象和发生背景

具有很多点不光滑的图像,提取拟合边界矩形

问题相关代码,请勿粘贴截图
# -*- coding: UTF-8 -*-
import cv2
import numpy as np


# 定义形状检测函数
def ShapeDetection(img):
    contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # 寻找轮廓点

    for obj in contours:

        area = cv2.contourArea(obj)  # 计算轮廓内区域的面积
        print(area)
        cv2.drawContours(imgContour, obj, -1, (255, 0, 0), 4)  # 绘制轮廓线
        perimeter = cv2.arcLength(obj, True)  # 计算轮廓周长
        print(perimeter)
        approx = cv2.approxPolyDP(obj, 0.02*perimeter, True)  # 获取轮廓角点坐标
        CornerNum = len(approx)   # 轮廓角点的数量
        x, y, w, h = cv2.boundingRect(approx)  # 获取坐标值和宽度、高度

        # 轮廓对象分类
        if CornerNum == 3: objType = "triangle"
        elif CornerNum == 4:
            if w == h: objType= "Square"
            else: objType = "Rectangle"
        elif CornerNum > 4: objType = "Circle"
        else: objType = "N"

        cv2.rectangle(imgContour, (x, y), (x+w, y+h), (0, 0, 255), 2)  # 绘制边界框
        cv2.putText(imgContour, objType, (x+(w//2), y+(h//2)), cv2.FONT_HERSHEY_COMPLEX, 0.6, (0, 0, 0), 1)  # 绘制文字


path = 'zr.jpg'
img = cv2.imread(path)
imgContour = img.copy()

imgGray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)  # 转灰度图
imgBlur = cv2.GaussianBlur(imgGray, (9, 9), 1)  # 高斯模糊
imgCanny = cv2.Canny(imgBlur, 250, 300)  # Canny算子边缘检测
ShapeDetection(imgCanny)  # 形状检测

cv2.imshow("Original img", img)
cv2.imshow("imgGray", imgGray)
cv2.imshow("imgBlur", imgBlur)
cv2.imshow("imgCanny", imgCanny)
cv2.imshow("shape Detection", imgContour)

cv2.waitKey(0)

运行结果及报错内容

这是灰度图

img


采用高斯平滑后的图:

img


canny检测后:

img


结果:

img

我的解答思路和尝试过的方法

我尝试调了高斯模糊和canny的阈值,但是没有用。
试了直线拟合

我想要达到的结果

我想要只提取内外两个矩形轮廓,像这样子:

img


请问应该怎么做呢

  • 写回答

4条回答 默认 最新

  • youcans_ 人工智能领域优质创作者 2022-05-29 19:21
    关注
    
        img = cv2.imread("../images/test01.png")  # 添加的前景图像
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图像
        _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY)
        invert = cv2.bitwise_not(binary)
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # (5, 5) 结构元
        dilate = cv2.dilate(invert, kernel=kernel, iterations=2)  # 图像膨胀
        contours, hierarchy = cv2.findContours(dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # OpenCV4~
        contourPic = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 2)  # OpenCV3
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月6日
  • 已采纳回答 5月29日
  • 修改了问题 5月29日
  • 创建了问题 5月29日

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?