使用skimage.transform.integral_image进行框过滤

时间:2020-09-14 14:10:16

标签: python-3.x image-processing scikit-learn

我遇到了以下问题。我尝试将框过滤器设为5x5,并希望在4个点(A,B-1,C-1,D-1)中计算矩形的总和,其中B-1是左上角,A是右下角点。我试图弄清楚应该如何计算第一行和第一列,导致结果如下:

[[  3   0 128 ... 128 128 128]
 [  0  40  40 ...   3   3   3]
 [  0  41  41 ...   4   4   4]
 ...
 [  0 116 114 ... 107 108 108]
 [128 116 112 ... 109 111 111]
 [  0 117 113 ... 110 112 113]]

skimage.transform.integrate()不适合,因为它花费约25秒的循环时间,并且工作正确。我的func integr()持续时间约为2 s,但是计算第一行和第一列时遇到问题。预先感谢您的回答和想法

随附以下代码

import numpy as np

from skimage.io import imread, imsave, imshow
import skimage.transform

def integr(integ, start, end):
    C = (start[0], end[1])
    D = (end[0], start[1])
    sum = integ[start] + integ[end] - integ[C] - integ[D]
    return sum

img = imread('in.png')

height = img.shape[0]
width = img.shape[1]

out = np.zeros((296,396), np.uint8)

integ = skimage.transform.integral_image(img)

y = -1
for i in range(2, height-2, 1):
    y += 1
    x = -1
    for j in range(2, width-2, 1):
        x +=1
        start = (i-3, j-3)
        end = (i+2, j+2)
        out[y, x] = integr(integ, start, end)//25

ref = imread('ref.png')

res = out - ref
imshow(res)
print(out)
print(res)

1 个答案:

答案 0 :(得分:0)

对于快速的框式过滤器,纯Python代码不会让您望而却步。使用优化的实现,例如scipy.ndimage.uniform_filtercv2.boxFilter