Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 应用Canny函数时,是否可以先应用遮罩?_Python_Opencv - Fatal编程技术网

Python 应用Canny函数时,是否可以先应用遮罩?

Python 应用Canny函数时,是否可以先应用遮罩?,python,opencv,Python,Opencv,我一直在学习Canny边缘检测功能、Hough变换和蒙版,以选择图像中的一组特定边缘 我只是想知道-我见过人们先应用这两个函数,然后再应用掩码。应用遮罩会首先提高性能吗 当然,如果只对遮罩区域应用Canny函数和Hough变换,那么比将它们应用于整个区域然后拾取遮罩区域要快。但也许我是误解了 我不确定它是否相关,但我正在使用Python和OpenCV库。我知道它的功能不能在图像的子集上运行。但是我想知道为什么会这样。是的,你可以先使用口罩,但这会产生严重的低于标准的结果 例如,考虑下面的代码:

我一直在学习Canny边缘检测功能、Hough变换和蒙版,以选择图像中的一组特定边缘

我只是想知道-我见过人们先应用这两个函数,然后再应用掩码。应用遮罩会首先提高性能吗

当然,如果只对遮罩区域应用Canny函数和Hough变换,那么比将它们应用于整个区域然后拾取遮罩区域要快。但也许我是误解了


我不确定它是否相关,但我正在使用Python和OpenCV库。我知道它的功能不能在图像的子集上运行。但是我想知道为什么会这样。

是的,你可以先使用口罩,但这会产生严重的低于标准的结果

例如,考虑下面的代码:

import numpy as np
import matplotlib.pyplot as plt
import scipy
from skimage import feature

# Create image
image = scipy.misc.face(gray=True)
plt.figure()
plt.imshow(image, cmap='gray')
plt.title('image')

# Create a simple mask
x, y = np.mgrid[:image.shape[0], :image.shape[1]]
mask = (x > 200) & (x < 500) & (y > 300) & (y < 700)
plt.figure()
plt.imshow(image * mask, cmap='gray')
plt.title('masked image')

# Find edges with both methods
edges1 = feature.canny(image, sigma=3)
edges1 *= mask

plt.figure()
plt.imshow(edges1, cmap='gray')
plt.title('Mask then find edges')

masked_image = image * mask
edges2 = feature.canny(masked_image, sigma=3)

plt.figure()
plt.imshow(edges2, cmap='gray')
plt.title('Find edges then mask')
结果如下:


请注意,如果在应用边缘检测器之前进行遮罩,会得到这种奇怪的帧。这是因为遮罩会创建从一开始就不存在的新边。

hiw您会先应用遮罩吗?如果在canny输入中将所有未遮罩的像素设为黑色,则很可能会在遮罩边界处获得许多边。可能是也可能不是你想要的…我明白了-所以如果你尝试填充它,你会得到一个红色的框,基本上是因为这个“框架”?是的,这就是你会得到的。也就是说,如果你的遮罩是矩形的,你可以提取图像的子集并分别对其应用边缘检测器。如果你想得到与完整图像大小相同的结果,你应该在遮罩周围添加一些与canny中/之前使用的梯度过滤器大小相等的边界区域。