【发布时间】:2018-11-20 10:22:30
【问题描述】:
我想用 Python 找到暗边。
输入图像(100 X 100):
它由几个水平板组成:顶部、中间、底部。
我想找到像这样的中间板边界框:
我使用了几种边缘检测方法(prewitt_x、sobel_x、cv2.findContours)但都不能很好地检测。
因为边缘btw黑色区域和板区域是暗淡的。
我怎样才能找到像红框这样的边界框?
以下代码是使用 prewitt_x 和 cv2.findContours 的示例:
import cv2
import numpy as np
img = cv2.imread('my_dir/my_img.bmp',0)
# prewitts_x
kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]])
img_prewittx = cv2.filter2D(img, -1, kernelx)
img_prewittx_gray = cv2.cvtColor(img_prewittx, cv2.COLOR_BGR2GRAY)
cv2.imwrite('my_outdir/my_outimg.bmp',img_prewittx)
# cv2.findContours
image, contours, hierarchy = cv2.findContours(img_prewittx_gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rects = [cv2.boundingRect(cnt) for cnt in contours]
print(rects)
事实上,我不想使用像 Canny 检测器这样速度较慢的检测器。
帮帮我:)
【问题讨论】:
-
我不确定我是否理解您的问题。几块板是什么意思?你到底想找到什么?无论如何,您的图像似乎很嘈杂。你不能改变颜色或应用降噪滤镜吗?
-
你可以用一个巨大的内核模糊图像,然后应用空间关闭操作。你不会得到最小的削减,但至少你可以得到不同的区域。当我理解问题时,它与 x 坐标无关。现在您可以在两个已识别的集合中搜索最长的白色区域并调整 y 值。
-
@fredguth 每张图片共有 5 个部分。从上到下:灰-黑-灰-黑-灰。灰色部分是我的意思是“borad”。你的意思是“改变颜色”?就像使用 HSV 过滤器一样?
-
@MaxKrappmann 你的意思是一个巨大的内核就像 [[10,10,10],[0,0,0],[10,10,10]] 而不是 [[1,1 ,1],[0,0,0],[1,1,1]] ?
-
不,您必须增加过滤器的大小。 docs.opencv.org/3.1.0/d4/d13/tutorial_py_filtering.html
标签: python opencv computer-vision contour edge-detection