python - 在opencv 2中扩展像素选择

标签 python opencv photoshop cv2 opencv-python

我在cv2中的图像上有一个选择蒙版,我想扩展像素的选择范围,以便可以将已选择像素半径R内的每个像素都添加到选择范围中。
我希望它的工作方式与Photoshop中的扩展功能相同。
我能想到的唯一方法是查看图像中的每个像素,如果它在选择中,则将半径R内的每个像素更改为选择的一部分。
最大的问题是它具有运行时O(R ^ 2 *#像素数)。
这真的很慢,我知道必须有更好的方法,因为即使对于大图片,Photoshop扩展选择方法也几乎可以立即起作用。
所以我想要一种方法来更改cv2或numpy中的方法以使其更快。
(也许有一种矢量化方法,但我不知道)

最佳答案

我想出了如何扩展选择范围的唯一问题,即它在图像边缘可能会出现一些错误。假设您具有 bool(boolean) 值掩码,这实际上很简单。除非它实际上没什么大不了,否则如果掩码是代表非选定区域的零和代表选定区域的正数,掩码仍然可以工作。

def expand(selection, radius):
    cop = np.copy(selection)
    for x in range(-radius,radius+1):
        for y in range(-radius,radius+1):
            if (y==0 and x==0) or (x**2 + y**2 > radius **2):
                continue
            shift = np.roll(np.roll(selection, y, axis = 0), x, axis = 1)
            cop += shift

    return cop
    
这是一个很好的例子
sel = np.array([[False, False, False, False, False],\
                [False, False, False, False, False],\
                [False, False, True, False, False],\
                [False, False, False, False, False],\
                [False, False, False, False, False]])
expand(sel, 2)
这运行得更快,我也相信是O(R ^ 2)相当快。它还为Photoshop扩展功能提供了类似于选择的结果。我相信唯一的区别是我的方法选择的是半径为R的圆内的像素,但是Photoshop选择的半径为R的六边形内的像素,这可以添加到if语句中。

关于python - 在opencv 2中扩展像素选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64052589/

相关文章:

css - CSS 凸版打印

python - 如何使用python+MySQLdb创建utf8mb4数据库,mysql命令行已经显示utf8mb4,但数据库仍然是utf8

c++ - 计算像素坐标 x 和 y

image-processing - openCV 中 Unresolved external symbol 错误

c++ - 尝试使用 opencv 在 C++ 中实现一小部分 matlab 代码

javascript - Photoshop JavaScript层创建

python - 如何使用适用于 Python 的 Azure SDK 更改 Office 365 用户头像

python - 检查 Python 中的唯一输出

python - Django ORM : Filter by extra attribute

css - 如何实现 "paper-like"背景效果?