crop center portion of a numpy image

后端 未结 5 1433
醉梦人生
醉梦人生 2020-12-08 13:52

Let\'s say I have a numpy image of some width x and height y. I have to crop the center portion of the image to width cropx and height cropy. Let\'s assume that cropx and cr

5条回答
  •  情话喂你
    2020-12-08 14:06

    A more general solution based on @Divakar 's answer:

    def cropND(img, bounding):
        start = tuple(map(lambda a, da: a//2-da//2, img.shape, bounding))
        end = tuple(map(operator.add, start, bounding))
        slices = tuple(map(slice, start, end))
        return img[slices]
    

    and if we have an array a

    >>> a = np.arange(100).reshape((10,10))
    
    array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
           [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
           [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
           [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
           [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
           [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
           [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
           [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
    

    We can clip it with cropND(a, (5,5)), you will get:

    >>> cropND(a, (5,5))
    
    array([[33, 34, 35, 36, 37],
           [43, 44, 45, 46, 47],
           [53, 54, 55, 56, 57],
           [63, 64, 65, 66, 67],
           [73, 74, 75, 76, 77]])
    

    It not only works with 2D image but also 3D image.

    Have a nice day.

提交回复
热议问题