代码之家  ›  专栏  ›  技术社区  ›  Obaid Ur Rehman

如何将函数定义为包入口点?

  •  1
  • Obaid Ur Rehman  · 技术社区  · 6 年前

    我创建了一个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 回复  |  直到 6 年前
        1
  •  1
  •   Giacomo Casoni    6 年前

    正如您可能知道的,python是一种脚本语言,因此程序的执行将从源文件的最上面开始,并一直持续到最后。 所以如果你执行这个文件 mycode.py 用命令 python mycode.py 执行将从源文件的最顶端开始 霉菌

    但是,这种方法在大型应用程序中会带来一些问题。通常,您运行的第一个命令是imports,它基本上获取一些其他的python文件,并在中执行代码。作为一个实际的例子,假设您有两个文件 first.py second.py . 第一。 开始如下:

        import second
    

    second 开始如下:

        def a_function():
          # do something
    

    然后python看到导入命令,运行 第二 ,并初始化函数 a_function() 这样它就可以在 第一。

    然而 第二 还可能包含要立即执行的代码。当解释器在文件上运行时,如下所示:

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

    现在我们有一个问题:打印语句将在 第一。 进口 第二 .

    为了解决这一问题,以下度量尤其用于将来要导入的文件:

        def a_function():
          # do something
    
        if __name__ == "__main__":
          print("I am executed")
    

    这不像是C入口点( int main(){...} )事实上,C编译器会寻找一个入口点,以便在代码的给定点开始执行。 pyhton exploted insted只需对预先定义的全局执行检查( __name__ )如果变量等于 "__main__" ,这是一个非常一般的解释,它意味着文件正在执行,否则文件将被导入(因此检查失败,代码不会执行)。

    因此,在您的情况下,只需定义您的功能( def remove_green_background(): ,并在源文件中首先调用它(基本上,第一个命令没有缩进)

        2
  •  1
  •   Martin    6 年前

    老实说,我不知道什么是切入点,为什么你需要它。

    如果希望函数执行所需操作,请执行以下操作:

    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-extraction和后台转换。忘记你在这里问的,看看opencv。查看opencv之后,请查看调用的opencv函数 cv2.inRange(hsv, lower_red, upper_red) -您只需在hsv范围内输入功能(例如浅绿色和深绿色,它将被删除)。一般来说, 背景去除或者更好地说,颜色转换被称为 彩色滤波

    检查这个链接。这里都解释了 -- what you are looking for --

        3
  •  0
  •   Salman Ahmed    6 年前

    入口点:代码开始执行的点称为入口点。

    C语言:

    入口点是:

    int main(){ .... } 
    

    在蟒蛇中:

    if __name__ == '__main__':
    

    从这一点开始,代码开始执行函数和所有的东西,所以这被称为入口点。