我正在尝试从关系数据库中检测所有矩形。但是我的脚本未检测到某些框。请帮我做到这一点。谢谢。
图片:
我的代码:
#!/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)
输出:
参考方案
这是使用阈值+形态运算的简单方法。
这是可视化的每个步骤:
使用此屏幕快照图像(由于提供的图像的矩形太靠近边框,因此包含更多边框)。您可以在输入图像上添加边框,而不是通过屏幕截图获取更多边框区域。看看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()
时可以增加或减少迭代次数。在增加或减少内核大小时需要权衡取舍,因为您可能会删除更多或更少的行。同样,这一切都取决于输入图像。
我在检测圆形区域时遇到问题。我使用来自opencv的HoughCircles函数进行了尝试。但是,即使图像非常相似,该功能的参数也必须不同才能检测到卷。我尝试的另一种方法是遍历每个像素,并检查当前像素是否为白色。如果是这种情况,请检查该区域中是否有斑点对象(到斑点中心的距离小于阈值)。如果存在,则将像素附加到斑点,如果没有,则创建一个新的斑点。这也不能正常工…
如何仅从图像中提取外部轮廓(OpenCV) - python我正在尝试使用简单的OpenCV轮廓线方法从下面的图像中提取数字,但是轮廓上出现重叠的边框cv2.RETR_EXTERNAL应该仅返回层次结构中的外部轮廓,但是从下面的输出可以看出,它不起作用码:from matplotlib import pyplot as plt import cv2 img = cv2.imread('image.png…
Python:图像处理可产生皱纹纸效果 - python也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…
用圆和线计算变换 - python我试图确定两个图像之间的转换(旋转+平移+缩放),以使其移动。图像是用两种不同的方式拍摄的,这些方式会产生非常不同的纹理。所以我不能使用基于维持光流的技术。我认为最好将图像阈值化以提取几何形状(请参见下面的示例)。但是然后我很难看到我能做些什么...也许可以提取垂直线和中心圆来帮助我提取变换。我在python中工作,我研究了Opencv可以提供的功能,但目前…
OpenCV 2.4 VideoCapture在Windows上不起作用 - python我正在使用Python绑定到通过以下instructions安装的OpenCV 2.4。我的问题类似于this one,但是我需要Windows计算机解决方案。问题:当我尝试使用时cap = cv2.VideoCapture(0) print cap.grab() 它工作正常,但是以下代码cap = cv2.VideoCapture(filename) pr…