問題描述
我正在嘗試從關系數據庫中檢測所有矩形.但是我的腳本沒有檢測到一些盒子.請幫我這樣做.謝謝.
I'm trying to detect all the rectangles from the relational database. But some of the boxes are not being detected by my script. Please help me to do that. Thank you.
圖片:
我的代碼:
#!/usr/bin/python
import cv2
import numpy as np
im = cv2.imread("table.png")
image = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(image,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
edge = cv2.Canny(thresh,30,200)
cont = cv2.findContours(edge,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]
for j,i in enumerate(cont):
x,y,w,h = cv2.boundingRect(i)
if (w*h>900):
cv2.drawContours(image,[i],0,(0,0,255),3)
cv2.imshow("Image",image)
cv2.waitKey(0)
輸出:
推薦答案
這是一個使用閾值+形態學運算的簡單方法.
Here's an simple approach using thresholding + morphological operations.
獲取二值圖像.加載圖像,轉換為灰度,然后自適應閾值
Obtain binary image. Load image, convert to grayscale, then adaptive threshold
填充矩形輪廓.查找輪廓并填充輪廓以創建填充矩形塊.
Fill rectangular contours. Find contours and fill the contours to create filled rectangular blocks.
執行 morph open.我們創建一個矩形結構元素并 morph open 以移除線條
Perform morph open. We create a rectangular structuring element and morph open to remove the lines
繪制矩形.查找輪廓并繪制邊界矩形.
Draw rectangle. Find contours and draw bounding rectangles.
<小時>
這是每個步驟的可視化:
Here's each step visualized:
使用此截屏圖像(包含更多邊框,因為提供的圖像的矩形太靠近邊框).您可以為輸入圖像添加邊框,而不是截圖以獲得更多邊框區域.看看為圖片添加邊框
Using this screenshotted image (contains more border since the provided image has the rectangles too close to the border). You could add a border to the input image instead of screenshotting for more border area. Take a look at add border to image
二值圖像
填充矩形輪廓
變形打開
結果
代碼
import cv2
# Load iamge, grayscale, adaptive threshold
image = cv2.imread('1.png')
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
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
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
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()
注意:根據圖像,您可能需要修改內核大小.例如,可能需要將內核從 (5, 5)
增加到 (11, 11)
.此外,您可以在執行 cv2.morphologyEx()
時增加或減少迭代次數.增加或減少內核大小時需要權衡取舍,因為您可能會刪除更多或更少的行.同樣,這一切都取決于輸入圖像.
Note: Depending on the image, you may have to modify the kernel size. For instance, it may be necessary to increase the kernel from (5, 5)
to say (11, 11)
. In addition, you could increase or decrease the number of iterations when performing cv2.morphologyEx()
. There is a trade-off when increasing or decreasing the kernel size as you may remove more or less of the lines. Again, it all varies depending on the input image.
這篇關于如何在不遺漏任何東西的情況下檢測所有矩形框python opencv的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!