【问题标题】:How to detect largest rectangle in a grid using opencv?如何使用opencv检测网格中最大的矩形?
【发布时间】:2023-03-12 08:40:02
【问题描述】:

我有一些网格形式的图像。我有一个代码可以在网格中找到最大的矩形。然而,它在某些图像中有效,而在其他图像中完全失败,我需要帮助微调代码以在所有情况下工作。理想情况下,我希望轮廓正好在边界上。

代码:

import cv2
import numpy as np

img =  cv2.imread('3.jpg')
frame = cv2.resize(img,(1000,500))

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 10, 120])
upper_red = np.array([15, 255, 255])
mask = cv2.inRange (hsv, lower_red, upper_red)
cv2.imshow("a",mask)
cv2.waitKey(0)

contours, _ = cv2.findContours(mask.copy(),
                           cv2.RETR_TREE,
                           cv2.CHAIN_APPROX_SIMPLE)
if len(contours) > 0:
    red_area = max(contours, key=cv2.contourArea)
    x, y, w, h = cv2.boundingRect(red_area)
    cv2.rectangle(frame,(x, y),(x+w, y+h),(0, 0, 255), 2)

cv2.imshow('frame', frame)
cv2.imshow('mask', mask)

cv2.waitKey(0)

正常工作的图片:

代码不起作用的图片:

【问题讨论】:

  • 如果所有图像都是这样(黑色图形,浅红色背景),您可能只想在 HSV 遮罩之前放大图像的对比度?
  • @ArohanAjit 预期的输出是没有周围文本的整个心电图??
  • @AKX 我按照你的建议做了,我认为问题在于内部图像的网格线比边框更突出,所以代码只检测内部网格线的最亮部分,而不是整个矩形。
  • 是的@Bilal,这是预期的输出,只有心电图区域,没有多余的

标签: python opencv image-processing


【解决方案1】:

您在在阈值化后找到最大轮廓的问题可以通过识别最大轮廓角来解决:

import cv2
import numpy as np

img =  cv2.imread('2.png')
frame = cv2.resize(img,(1000,500))

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 10, 120])
upper_red = np.array([15, 255, 255])
mask = cv2.inRange (hsv, lower_red, upper_red)


y0 = np.min(np.where(mask>0)[0])
x0 = np.min(np.where(mask>0)[1])

y1 = np.max(np.where(mask>0)[0])
x1 = np.max(np.where(mask>0)[1])

cv2.rectangle(frame,(x0, y0),(x1, y1),(0, 0, 255), 2)

cv2.imshow('frame', frame)
cv2.imshow('mask', mask)

cv2.waitKey(0)

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2018-05-03
    • 1970-01-01
    • 2021-07-03
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多