Искусственно увеличивая область интереса изображения - PullRequest
0 голосов
/ 01 октября 2019

Я решаю проблему сегментации изображения. Чтобы повысить точность модели, я наткнулся на следующий шаг предварительной обработки:

Сначала определяется набор пикселей внешней границы области интереса, т. Е. Пикселей, находящихся за пределами области интереса. и являются соседями (используя четыре окрестности) для пикселей внутри него. Затем каждое значение пикселя этого набора заменяется средним значением его соседей (на этот раз с использованием восьми соседей) внутри области интереса. Наконец, ROI расширяется путем включения этого измененного набора пикселей. Этот процесс повторяется и может рассматриваться как искусственное увеличение ROI.

Изображение после применения следующего шага ниже - enter image description here

ИзображениеЯ применяю вышеуказанный шаг ниже - enter image description here

Задав вопрос здесь , я получил первоначальный подход, чтобы взять черную область, окружающую мое изображение, ииспользуйте его как альфа-маску.
Мой подход к решению этой проблемы состоит в том, чтобы найти все граничные пиксели (вне поля зрения), которые являются первыми черными пикселями вне красной части, которые я получил с помощью приведенного ниже кода:

    my_list = []
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if (j+1)<=564:
            if (img[i][j+1]==255) and (img[i][j-1]!=255):
                my_list.append([i,j])
        elif (j+1)<=564:
            if img[i][j+1]==0 and img[i][j]!=0:
                my_list.append([i,j])
        elif (i-1)>=0:
            if img[i-1][j]==255 and img[i][j]==0 :
                my_list.append([i,j])
        elif (i+1) >=0:
            if img[i+1][j]==255 and img[i][j]==0:
                my_list.append([i,j])

Моя идеяза приведенным выше кодом я могу разделить маску на 4 секции и затем найти граничные пиксели в соответствии с этим - я выделил 4 секции ниже (извинения за плохую иллюстрацию) -

enter image description here

Теперь, после определения граничных пикселей вне поля зрения, мне нужно заменить их на среднее значение соседних пикселей (8-соседей), которое в данном случае будет средним значением 3 пикселей в качестве пикселя. который мы модифицируем, всегда будет в углу, как показано ниже -

enter image description here

Так что мои вопросы -
1) Правильно ли мыслительный процесс?
2) Я не знаю, как изменить пиксели соседними пикселями?
Любой другой подход к его решению также приветствуется.

Редактировать --- Решение проблемы в соответствии сответить

 while(notroi):
    border_pixels = []
    for i in range(img.size[0]):
        for j in range(img.size[1]):
            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:
        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+=pixelMap[pix_i,pix_j]
                count+=1
        pixelMap[each_i,each_j]=(color_sum//count)

    for (each_i,each_j) in border_pixels:
        roi.append([each_i,each_j])
        border_pixels.remove([each_i,each_j])
        notroi = notroi-1
        print(notroi)

Редактировать: полученное изображение -
enter image description here

1 Ответ

1 голос
/ 01 октября 2019

Упомянутый вами подход на самом деле намного проще. Если у вас есть исходная область интереса в виде маски на пиксель, то алгоритм выглядит следующим образом в псевдокоде (обработка границ для ясности опущена):

while there are pixels not in the ROI:
    border_pixels = []

    # find the border pixels
    for each pixel p=(i, j) in image
        if p is 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)):
            add p to border_pixels

    # calculate the averages
    for each pixel p in border_pixels:
        color_sum = (0, 0, 0)
        count = 0
        for each pixel n in 8-neighborhood of p:
            if n in ROI:
                color_sum += color(n)
                count += 1
        color(p) = color_sum / count

    # update the ROI
    for each pixel p=(i, j) in border_pixels:
        set p to be in ROI
...