Выберите интересующий регион с правилами границы - PullRequest
0 голосов
/ 09 декабря 2018

Я хотел бы извлечь небольшое окно вокруг каждого пикселя в моем изображении.Конечно, я могу использовать нарезку списка Python для достижения этой цели.Но одна только нарезка списка не решит «крайний случай», когда окно размером W просто не существует вокруг пикселя, потому что оно близко к краю.Рассмотрим простую матрицу M

1 1 1 1
1 1 1 1
1 1 1 1

Если я захочу выбрать окно размером 3x3 около M(1,1), я не смог бы, потому что над ним или слева от него ничего нет.

Есть ли в Skimage функция Numpy или что-то такое, что позволило бы мне указать, что происходит, когда индекс списка выходит за границы?Например, что если я просто хочу скопировать ближайшего соседа?

Я, конечно, могу написать эту логику самостоятельно, поскольку это тривиальный алгоритм.Мне просто интересно, существует ли такая опция в Numpy, Skimage, OpenCV и т. Д.

1 Ответ

0 голосов
/ 09 декабря 2018

Обычно вы дополняете изображение сначала с помощью np.pad() (документы) или cv2.copyMakeBorder() (документы) и смещаете индексы, которые хотите выбрать, в зависимости от размера вашегообивка.Хорошая вещь в обеих этих функциях заключается в том, что они предоставляют множество различных опций, с которыми добавляются изображения.У Numpy гораздо больше опций, но большинство стандартных, которые вы хотели бы использовать (повторение краевых пикселей, зеркальное отображение краевых пикселей, обтекание краевых пикселей или постоянное заполнение), доступны в обеих библиотеках.

Типы NumPy границ прямо перечислены в документах, но я скопирую их здесь:

mode : str or function
    One of the following string values or a user supplied function.

    ‘constant’
        Pads with a constant value.

    ‘edge’
        Pads with the edge values of array.

    ‘linear_ramp’
        Pads with the linear ramp between end_value and the array edge value.

    ‘maximum’
        Pads with the maximum value of all or part of the vector along each axis.

    ‘mean’
        Pads with the mean value of all or part of the vector along each axis.

    ‘median’
        Pads with the median value of all or part of the vector along each axis.

    ‘minimum’
        Pads with the minimum value of all or part of the vector along each axis.

    ‘reflect’
        Pads with the reflection of the vector mirrored on the first and last values of the vector along each axis.

    ‘symmetric’
        Pads with the reflection of the vector mirrored along the edge of the array.

    ‘wrap’
        Pads with the wrap of the vector along the axis. The first values are used to pad the end and the end values are used to pad the beginning.

    <function>
        Padding function, see Notes.

В нем есть примечания для произвольных переданных функций, что является отличной возможностью.

Типы границ OpenCV не указываются непосредственно в документах copyMakeBorder(), но вы можете найти их, выполнив поиск типов границ в документах .Опять же, просто чтобы они были на SO:

BORDER_CONSTANT 
Python: cv.BORDER_CONSTANT
iiiiii|abcdefgh|iiiiiii with some specified i

BORDER_REPLICATE 
Python: cv.BORDER_REPLICATE
aaaaaa|abcdefgh|hhhhhhh

BORDER_REFLECT 
Python: cv.BORDER_REFLECT
fedcba|abcdefgh|hgfedcb

BORDER_WRAP 
Python: cv.BORDER_WRAP
cdefgh|abcdefgh|abcdefg

BORDER_REFLECT_101 
Python: cv.BORDER_REFLECT_101
gfedcb|abcdefgh|gfedcba

BORDER_TRANSPARENT 
Python: cv.BORDER_TRANSPARENT
uvwxyz|abcdefgh|ijklmno

BORDER_REFLECT101 
Python: cv.BORDER_REFLECT101
same as BORDER_REFLECT_101

BORDER_DEFAULT 
Python: cv.BORDER_DEFAULT
same as BORDER_REFLECT_101

BORDER_ISOLATED 
Python: cv.BORDER_ISOLATED
do not look outside of ROI
...