Ускоряя пиксель за пиксельными операциями на изображении - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь выполнять пиксельные операции над изображением, но это мучительно медленно. Это занимает 7-8 часов для одного изображения измерения (512 * 512), и у меня есть изображения до 2048 * 2048.

Я также пробовал оптимизировать его, используя Numba но это занимает столько же времени из-за присутствия большого количества pyobjects, что в соответствии с этим руководством плохо, так как numba не может перевести переменные во что-то, что понимает, и, следовательно, оптимизировать.

Ниже приведена краткая версия моего вопроса, я приложил полную информацию. Итак, теперь я пытаюсь использовать Cython, следуя этому учебному пособию. Ниже приведен мой код, который я пытаюсь оптимизировать -

img = Image.open(path_dir)
pixelMap = img.load()
roi = []
for i in range(img.size[0]):
    for j in range(img.size[1]):
        if pix[i,j] == 255:
            roi.append([i,j])

notroi = img.size[0]*img.size[1] - len(roi)

Выше этого, это не займет много времени, и мне не нужно его изменять.

def roifun(img,roi,notroi,newmap,pix):
    while(notroi):
        border_pixels = []
        h = img.size[0]
        w = img.size[1]
        for i in range(0,h):    //---1
            for j in range(0,w):
                if [i,j] not in roi and ([i+1, j] in roi or [i-1, j] in roi or [i, j+1] in roi or [i, j-1] in roi):
                    border_pixels.append([i,j])
        for (each_i,each_j) in border_pixels: //---2
            color_sum = 0
            count = 1
            eight_neighbourhood = [[each_i-1,each_j],[each_i+1,each_j],[each_i,each_j-1],[each_i,each_j+1],[each_i-1,each_j-1],[each_i-1,each_j+1],[each_i+1,each_j-1],[each_i+1,each_j+1]]
            for pix_i,pix_j in eight_neighbourhood:
                if (pix_i,pix_j) in roi:
                    color_sum+=pix[pix_i,pix_j]
                    count+=1
            newmap[each_i,each_j]=(color_sum//count)

        for (i,j) in border_pixels: //----3
            roi.append([i,j])
            border_pixels.remove([i,j])
            notroi = notroi-1
            print(notroi)

Теперь я просто решил проблему преобразования приведенного выше кода в Cython из 3 частей (в соответствии с их циклами for) для упрощения отладки.

Я преобразовал первый цикл следующим образом -

%%cython -a
import cython
cimport numpy as np
# @cython.boundscheck(False)
cpdef border(img,roi):
    border_pixels = []
    cdef long h,w,i,j
    h = img.shape[0]
    w = img.shape[1]
    for i in range(0,h):
        for j in range(0,w):
            if [i,j] not in roi and ([i+1, j] in roi or [i-1, j] in roi or [i, j+1] in roi or [i, j-1] in roi):
                border_pixels.append([i,j])

Проблема, с которой я столкнулся -
1) Получение TypeError: a bytes-like object is required, not 'list' при вызове функции border.
Я не знаю, почему ожидается, что список будет в byte like object и как это сделать.
2) Я не знаю, как преобразовать изображение в Cython, я попытался преобразовать его в char[:,:], но затем получил ошибку TypeError: a bytes-like object is required, not 'GIFImageFile.

Во втором цикле я будуУ меня такая же проблема, но теперь я должен также попытаться преобразовать pix, который является pixel object.

В случае, если вам, ребята, интересно, чего я пытаюсь достичь, полные детали находятся в этом вопросе.
Расширение области интереса изображения

Также приветствуется любой другой способ без цитона.

1 Ответ

2 голосов
/ 17 октября 2019

Я бы определенно использовал scikit-image или, по крайней мере, использовал numpy для всего, что нужно для обработки пикселей на изображении. Это будет слишком долго в чистом питоне.

Чтобы воспроизвести ваш первый бит кода с помощью Skimage, я бы сделал следующее:

from skimage import io

img = io.imread(path_dir)
mask = img == 255

Это даст вам массив значений True / False, где пиксели равны 255. Затем вы можете расширить эту маску, чтобы получить расширенную область интересов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...