Контуры обработки изображений - PullRequest
1 голос
/ 05 февраля 2012

Я пишу программу, которая выполняет базовую обработку изображений.

Имейте в виду, что изображения в градациях серого, а не в RGB, также, я довольно плохо знаком с Python, поэтому объяснение того, что я делаю неправильно / правильно, было бы невероятно полезным.

Я пытаюсь написать контурный алгоритм, который следует этому набору правил:

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

Пока у меня есть это:

def outlines(image):
    """
    Finds the outlines of shapes in an image.  The parameter must be
    a two-dimensional list of pixels.  The return value is another
    two-dimensional list of pixels which describes an image showing
    outlines of the shapes in the original image.  Each pixel in the
    return value will be either black (0) or white (255).
    """
    height=len(image)
    width=len(image[0])
    new_image=[]
    for r in range(height):
        new_row=[]
        index=0
        for c in range(width):
            if image[r][c]>128:
                new_row.append(255)
            if image[r][c]<=128:
                new_row.append(0])
        new_image.append(new_row)

Может кто-нибудь показать мне, как внедрить алгоритм в мою функцию контуров?

Заранее спасибо.Редактировать: Это задание для моего класса University Comp Sci, я не прошу кого-то делать домашнее задание, потому что я практически не знаю, каким будет следующий шаг.Edit2: Если бы кто-то мог объяснить мне простую функцию обнаружения края, которая похожа на алгоритм, который я должен создать, я был бы признателен.

1 Ответ

1 голос
/ 05 февраля 2012

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

Проверьте эту функцию и попробуйте использовать ее для этой цели:

def all_are_dark_around(image, r, c):
    # range gives the bounds [-1, 0, 1]
    # you could use the list directly. Probably better for this especific case
    for i in range(-1,2):              
        for j in range(-1,2):
            # if the pixel is clear return False.
            # note that image[r+0][c+0] is always dark by definition
            if image[r+i][c+j] <= 128:  
                return False
    #the loop finished -> all pixels in the 3x3 square were dark
    return True

Советы:

  1. обратите внимание, что вы никогда не должны проверять image[r][c], когда r или c равны до 0 или height или width. То есть, когда проверенный пиксель находится в граница, потому что в этом случае есть по крайней мере одна сторона, где на изображении нет смежного пикселя, и вы получите IndexError
  2. не ожидайте, что этот код будет работать напрямую и будет лучшим кодом на условия эффективности или хорошего стиля. Это подсказка для вашей домашней работы. Тебе следует это сделать. Так что посмотрите на код, не торопитесь ( оптимально это должно быть равно или дольше, чем время, которое потребовалось мне, чтобы написать функция ), поймите, как она работает, и адаптируйте ее к исправлению кода любые исключения и пограничные ситуации, с которыми вы сталкиваетесь на пути.
...