gpt4 book ai didi

python - 性能:扩大二值图像(形态膨胀)

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:40 27 4
gpt4 key购买 nike

我编写了一个 Cython 函数,它将二进制图像(numpy 数组)扩展 1 个像素。所以我只想扩大数组值为1的区域。这是我的天真的方法:

def expand_1px (numpy.ndarray[numpy.uint8_t, ndim = 2] A):
cdef int h = A.shape[0]
cdef int w = A.shape[1]
cdef numpy.ndarray[numpy.uint8_t, ndim = 2] RES = numpy.zeros([h, w], dtype = numpy.uint8)
# These Two lines below were originally missing
cdef int y, x
cdef unsigned char prev, cur

for x in range (0, w):
for y in range (1, h):
prev = A[y-1,x]
cur = A[y,x]
if cur > prev:
RES[y-1, x] = 1
if cur < prev:
RES[y,x] = 1
for y in range (0, h):
for x in range (1, w):
prev = A[y,x-1]
cur = A[y,x]
if cur > prev:
RES[y, x-1] = 1
if cur < prev:
RES[y,x] = 1
return numpy.bitwise_or(A,RES)

这可以正常工作,但是非常慢。OpenCV 函数 dilate() 比我的 Cython 变体快 1000 ~30 倍,并给出相同的结果。我这样使用它:

kernel = numpy.ones((3,3), dtype="uint8")
kernel[0,0] = 0
kernel[2,2] = 0
kernel[0,2] = 0
kernel[2,0] = 0
...
IMG = cv2.dilate(IMG,kernel,iterations = 1)
<小时/>

:

  • OpenCV 的变种怎么可以这么快?它实际上有什么作用?
  • 如何让我的 Cython 函数运行得这么快?
<小时/>

更新:

如此糟糕的性能是由于缺少“cdef”声明,我的错。将其添加到函数中会产生不同:

cdef int  y, x
cdef unsigned char prev, cur

性能差异仍然是大约 30 倍,这也有点令人失望。有进一步改进的建议吗?

最佳答案

您的函数存在一个大问题:您正在执行所需的更多循环。

import cython

@wraparound(false)
def expand_1px(numpy.ndarray[numpy.uint8_t, ndim = 2] A):
cdef int h = A.shape[0]
cdef int w = A.shape[1]
cdef numpy.ndarray[numpy.uint8_t, ndim = 2] RES = numpy.zeros([h, w], dtype = numpy.uint8)
cdef int y, x
cdef unsigned char prev, cur

for x in range(1, w):
for y in range(1, h):
cur = A[y,x]

prev = A[y-1,x]
if prev < cur:
RES[y-1,x] = 1
elif cur < prev:
RES[y,x] = 1

prev = A[y, x-1]
if prev < cur:
RES[y,x-1] = 1
elif cur < prev:
RES[y,x] = 1

for x in range(1, w):
cur = A[0,x]
prev = A[0,x-1]
if prev < cur:
RES[0,x-1] = 1
elif cur < prev:
RES[0,x] = 1

for y in range(1, h):
cur = A[y,0]
prev = A[y-1,0]
if prev < cur:
RES[y-1,0] = 1
elif cur < prev:
RES[y,0] = 1

return numpy.bitwise_or(A,RES)

最初,您进行 2wh 次迭代,通过此更改,您将只进行 wh + w + h 次迭代。

关于python - 性能:扩大二值图像(形态膨胀),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192456/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com