在图纸上运行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
我该如何改善?
答案 0 :(得分:2)
这是在Python / OpenCV中执行此操作的一种方法。
形态学边缘是口罩和扩张型口罩之间的绝对差异
输入:
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)
阈值图片:
膨胀的阈值图像:
差异图片:
边缘图像:
答案 1 :(得分:1)
通过将内核尺寸从(11,11)更改为(0,0),我成功地使cv.Canny
给出了令人满意的结果,从而允许内核由sigma动态确定。通过执行此操作并调整sigma,我得到了很好的结果。另外,cv.imshow
使图像失真,因此当我使用它进行测试时,结果看上去比实际情况差很多。