Как определить функцию, которая будет точкой входа в пакет? - PullRequest
0 голосов
/ 12 января 2019

Я создал программу на python, которая просто удаляет зеленый фон с изображений.

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

Так, кто-нибудь может объяснить мне, используя этот код подробно, что, где поместить эти точки входа?

from PIL import Image
import sys
import os


def rgb_to_hsv(r, g, b):
    maxc = max(r, g, b)
    minc = min(r, g, b)
    v = maxc
    if minc == maxc:
        return 0.0, 0.0, v
    s = (maxc-minc) / maxc
    rc = (maxc-r) / (maxc-minc)
    gc = (maxc-g) / (maxc-minc)
    bc = (maxc-b) / (maxc-minc)
    if r == maxc:
        h = bc-gc
    elif g == maxc:
        h = 2.0+rc-bc
    else:
        h = 4.0+gc-rc
    h = (h/6.0) % 1.0
    return h, s, v


GREEN_RANGE_MIN_HSV = (100, 80, 70)
GREEN_RANGE_MAX_HSV = (185, 255, 255)

def remove_green_background():
    # Load image and convert it to RGBA, so it contains alpha channel
    name, ext = os.path.splitext(Filepath)
    im = Image.open(Filepath)
    im = im.convert('RGBA')

    # Go through all pixels and turn each 'green' pixel to transparent
    pix = im.load()
    width, height = im.size
    for x in range(width):
        for y in range(height):
            r, g, b, a = pix[x, y]
            h_ratio, s_ratio, v_ratio = rgb_to_hsv(r / 255.0, g / 255.0, b / 255.0)
            h, s, v = (h_ratio * 360, s_ratio * 255, v_ratio * 255)

            min_h, min_s, min_v = GREEN_RANGE_MIN_HSV
            max_h, max_s, max_v = GREEN_RANGE_MAX_HSV
            if min_h <= h <= max_h and min_s <= s <= max_s and min_v <= v <= max_v:
                pix[x, y] = (0, 0, 0, 0)


    im.save(name + '.png')


if __name__ == '__main__':
    remove_green_background()

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Точка входа: Точка, с которой код начинает свое выполнение, называется точкой входа.

На языке Си:

Точка входа:

int main(){ .... } 

В Python:

if __name__ == '__main__':

С этого момента код начинает выполнять функции и все прочее. Так что это называется точкой входа.

0 голосов
/ 12 января 2019

Как вы, наверное, знаете, Python является языком сценариев, поэтому выполнение программы начнется с самого начала вашего исходного файла и продолжится до самого конца. Поэтому, если вы выполните файл mycode.py с помощью команды python mycode.py, выполнение начнется с самой верхней части исходного файла mycode.py

Однако этот подход приносит несколько проблем в больших приложениях. Обычно первые команды, которые вы запускаете, это import, который в основном выбирает какой-то другой файл Python и выполняет код внутри in. Так что в качестве практического примера, скажем, у вас есть 2 файла first.py и second.py. first.py начинается следующим образом:

    import second

и second начинаются следующим образом:

    def a_function():
      # do something

затем Python видит команду импорта, запускает second.py и инициализирует функцию a_function(), так что теперь она доступна в first.py

Однако second.py может также содержать код, который должен быть выполнен сразу же после запуска интерпретатора в файле, например:

    def a_function():
      # do something
    print("I am called upon execution")

Теперь у нас есть проблема: оператор print будет выполняться, когда first.py import second.py.

Чтобы обойти это, используется следующая мера ОСОБЕННО В ФАЙЛАХ, КОТОРЫЕ СЛЕДУЮТ ДЛЯ БУДУЩЕГО ИМПОРТА:

    def a_function():
      # do something

    if __name__ == "__main__":
      print("I am executed")

Это НЕ похоже на точку входа C (int main(){...}). Фактически, компилятор C ищет точку входа, чтобы начать выполнение в заданной точке кода. Интерпретированный Pyhton insted просто выполняет проверку предопределенного глобала (__name__). Если переменная равна "__main__", это очень общее объяснение, это означает, что файл выполняется, в противном случае файл импортируется (поэтому проверка завершается неудачно и код не выполняется).

Так что в вашем случае просто определите вашу функцию (def remove_green_background():) и назовите ее первым в исходном файле (в основном, первая команда без отступа)

0 голосов
/ 12 января 2019

Если честно, я действительно не знаю, что такое точка входа и зачем она вам нужна.

Если вы хотите, чтобы функция делала то, что вы хотите, просто сделайте это:

def remove_green_background(Filepath,destination_file):
    # Load image and convert it to RGBA, so it contains alpha channel

    im = Image.open(Filepath)
    im = im.convert('RGBA')

    # Go through all pixels and turn each 'green' pixel to transparent
    pix = im.load()
    width, height = im.size
    for x in range(width):
        for y in range(height):
            r, g, b, a = pix[x, y]
            h_ratio, s_ratio, v_ratio = rgb_to_hsv(r / 255.0, g / 255.0, b / 255.0)
            h, s, v = (h_ratio * 360, s_ratio * 255, v_ratio * 255)

            min_h, min_s, min_v = GREEN_RANGE_MIN_HSV
            max_h, max_s, max_v = GREEN_RANGE_MAX_HSV
            if min_h <= h <= max_h and min_s <= s <= max_s and min_v <= v <= max_v:
                pix[x, y] = (0, 0, 0, 0)


    im.save(destination_file)


path_to_my_image = 'image_with_background.png'
save_image_as = 'image_without_background.png'
remove_green_background(path_to_my_image,save_image_as )

РЕДАКТИРОВАТЬ:

Кроме того, если честно, этот пример, который вы опубликовали, супер-ужасен. Библиотеки, такие как OpenCV, делают это для вас без так называемого крайне медленного и супер-плохого петли-hsvmanual-extract_and_transformation-of-background. Забудьте то, что вы спросили здесь, и посмотрите на openCV. После того, как вы посмотрите на openCV, посмотрите на функцию openCV под названием cv2.inRange(hsv, lower_red, upper_red) - вы просто кормите функцию с диапазоном HSV (например, светло-зеленым и темно-зеленым, и она будет удалена). В общем, это удаление фона или, лучше сказать, преобразование цвета называется Цветовая фильтрация

Проверьте эту ссылку. Здесь все объяснено - что вы ищете -

...