【问题标题】:Edge detection on dim edges using Python使用 Python 对暗边进行边缘检测
【发布时间】: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


【解决方案1】:

我的建议:

  • 使用简单的边缘检测过滤器,例如 Prewitt

  • 水平投影(每行像素的总和)

  • 分析生成的轮廓以检测低/高活性区域并划定所需的平板。

您也可以尝试沿行的最大值而不是总和。

但不要指望奇迹,这是一个难题。

【讨论】:

  • 感谢您的评论 :) 我会试试的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2012-10-17
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多