改善Canny边缘检测

时间:2020-05-06 18:51:37

标签: python opencv image-processing

在图纸上运行cv.Canny边缘检测器时,它检测到数百个密密麻麻地包裹在阴影区域中的小边缘。在仍然检测到眼睛和鼻子等较浅的特征的同时,我如何才能停止这样做呢?我也尝试过模糊。

online photo tool相比,这是一个例子。

Original image
Output of online tool
My python program

这是我的代码:

def outline(image, sigma = 5):
    image = cv.GaussianBlur(image, (11, 11), sigma)
    ratio = 2
    lower = .37 * 255
    upper = lower * ratio
    outlined = cv.Canny(image, lower, upper)

    return outlined

我该如何改善?

2 个答案:

答案 0 :(得分:2)

这是在Python / OpenCV中执行此操作的一种方法。

形态学边缘是口罩和扩张型口罩之间的绝对差异

  • 阅读输入内容
  • 转换为灰色
  • 阈值(作为掩码)
  • 扩大阈值图像
  • 计算绝对差
  • 将其极性反转为边缘图像
  • 保存结果

输入:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread("cartoon.jpg")

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold
thresh = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY)[1]

# morphology edgeout = dilated_mask - mask
# morphology dilate
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.morphologyEx(thresh, cv2.MORPH_DILATE, kernel)

# get absolute difference between dilate and thresh
diff = cv2.absdiff(dilate, thresh)

# invert
edges = 255 - diff

# write result to disk
cv2.imwrite("cartoon_thresh.jpg", thresh)
cv2.imwrite("cartoon_dilate.jpg", dilate)
cv2.imwrite("cartoon_diff.jpg", diff)
cv2.imwrite("cartoon_edges.jpg", edges)

# display it
cv2.imshow("thresh", thresh)
cv2.imshow("dilate", dilate)
cv2.imshow("diff", diff)
cv2.imshow("edges", edges)
cv2.waitKey(0)


阈值图片:

enter image description here

膨胀的阈值图像:

enter image description here

差异图片:

enter image description here

边缘图像:

enter image description here

答案 1 :(得分:1)

通过将内核尺寸从(11,11)更改为(0,0),我成功地使cv.Canny给出了令人满意的结果,从而允许内核由sigma动态确定。通过执行此操作并调整sigma,我得到了很好的结果。另外,cv.imshow使图像失真,因此当我使用它进行测试时,结果看上去比实际情况差很多。