使用 OpenCV 进行垂直曲线检测

Posted

技术标签:

【中文标题】使用 OpenCV 进行垂直曲线检测【英文标题】:Vertical curved line detection with OpenCV 【发布时间】:2019-12-02 19:12:16 【问题描述】:

我想检测图像中间的垂直曲线。你知道怎么做吗?我想用线分隔左侧和右侧。我应该使用什么功能或过滤器?非常感谢您提出如何检测线路的想法。

这是图片的链接:

顺便说一句:我在 Python 中使用 OpenCV 库。

【问题讨论】:

你的图像总是喜欢这样吗,那条线的右边是黑色,左边是嘈杂的水平线? 是的,它总是像这张图片 所以我会尝试将图像分割成黑色与噪声区域(可能是简单的阈值),然后提取该噪声部分的右边界。不幸的是,我没有时间在 atm 实现它。 【参考方案1】:

抱歉,我不太了解 OpenCV。所以这里是如何做到这一点的大纲。我还展示了使用 Imagemagick 和 Python Wand 代码的代码。请注意,我保存中间图像以显示步骤。

Read the image

Blur it some

Threshold is to binary

Do connected components processing to remove all small regions (see contours or blobs in OpenCV)

Use morphology open and close to smooth the edges

Extract an edge outline of the transition between white and black (there are many edge operators: laplacian, gradients, canny, etc)

输入:

convert img.jpg -blur 0x1 -threshold 9% -type bilevel +write threshold.png \
-define connected-components:mean-color=true \
-define connected-components:area-threshold=10000 \
-connected-components 4 +write ccl.png \
-morphology open disk:5 \
-morphology close disk:5 +write smooth.png \
-morphology edge diamond:1 \
result.png

门槛:

连接组件:

流畅:

结果:

这是使用 Python Wand 0.5.6(目前正在开发中)和 Imagemagick 7.0.8.56 的等效代码

#!/bin/python3.7

from wand.image import Image
from wand.display import display

with Image(filename='curve.jpg') as img:
    img.blur(radius=0, sigma=1)
    img.threshold(threshold=0.09)
    img.connected_components(connectivity=4, area_threshold=1000, mean_color=True)
    img.morphology(method='open', kernel='disk:5')
    img.morphology(method='close', kernel='disk:5')
    img.morphology(method='edge', kernel='diamond:1')
    img.save(filename='0_wand_trim.png')
    display(img)

【讨论】:

【参考方案2】:

这是一个简单的方法

将图像转换为灰度和中值模糊 获取二值图像的阈值 执行morphological transformations 平滑图像 执行精确边缘检测

中值模糊→阈值→打开→关闭→Canny

import cv2

image = cv2.imread('1.jpg', 0)
blur = cv2.medianBlur(image, 9)
thresh = cv2.threshold(blur, 25, 255, cv2.THRESH_BINARY)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=3)
canny = cv2.Canny(close, 120, 255, 1)

cv2.imshow('canny', canny)
cv2.waitKey()

【讨论】:

以上是关于使用 OpenCV 进行垂直曲线检测的主要内容,如果未能解决你的问题,请参考以下文章

在opencv中使用霍夫变换检测垂直线

检测水平和垂直边缘opencv

opencv 和 python - 激光曲线检测

opencv---曲线断点检测(八邻域断点检测)

opencv---曲线断点检测(八邻域断点检测)

opencv---曲线断点检测(八邻域断点检测)