【问题标题】:Opencv Python: How to detect filled, rectangular shapes on pictureOpencv Python:如何检测图片上的填充矩形
【发布时间】:2021-04-28 23:00:14
【问题描述】:

我有下面的图片。 我想使用opencv找到左边的黑色矩形。谢谢你的帮助=)

【问题讨论】:

  • 请提供更多细节。目前看来,您的问题没有多大意义。

标签: python opencv


【解决方案1】:

这里是a simple approach,使用阈值 + 形态学操作。

  1. 获取二值图像。加载图像,转换为灰度,然后自适应阈值

  2. 填充矩形轮廓。查找轮廓并填充轮廓以创建填充矩形块。

  3. 执行 morph open。 我们创建一个矩形结构元素并 morph open 以删除线条

  4. 在最大矩形周围绘制矩形查找轮廓并在面积超过特定阈值的矩形周围绘制边界矩形。


这是每个步骤的可视化:

获取二值图像

自适应阈值

填充矩形轮廓

执行变形打开

在最大的矩形周围画矩形

在代码中:

import numpy as np 
import cv2

#load the image
image = cv2.imread("mtF6y.jpg")

# grayscale
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

# adaptive threshold
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,51,9)

# Fill rectangular contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(thresh, [c], -1, (255,255,255), -1)

# Morph open
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=4)

# Draw rectangles, the 'area_treshold' value was determined empirically
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
area_treshold = 4000
for c in cnts:
    if cv2.contourArea(c) > area_treshold :
      x,y,w,h = cv2.boundingRect(c)
      cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)

cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('image', image)
cv2.waitKey()

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 2011-07-19
    • 2012-04-10
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2020-10-13
    • 2020-04-07
    相关资源
    最近更新 更多