如何将函数定义为包入口点?
How to define a function to be a package entry point?
我创建了一个 python 程序,它可以简单地从图像中删除绿色背景。
现在我想实现定义为入口点的函数 remove_green_background()
。我搜索过很多网站,也搜索过 Whosebug,但无法理解入口点的工作原理。
所以任何人都可以使用这段代码向我详细解释将这些入口点放在哪里?
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()
老实说,我真的不知道入口点是什么以及为什么需要它。
如果你想让一个函数做你想做的事情,就这样做:
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 这样的库没有这个所谓的 extremely-slow-and-super-bad-loopbased-hsvmanual-extraction_and_transformation-of-background 就可以为你做这件事。忘记你在这里问的,看看openCV。查看 openCV 后,查看名为 cv2.inRange(hsv, lower_red, upper_red)
的 openCV 函数 - 您只需提供 HSV 范围的函数(例如浅绿色和深绿色,它将被删除)。一般来说,这
背景去除或者更确切地说,颜色转换称为 颜色过滤
检查此 link。一切都在这里解释
--what you are looking for--
入口点:代码开始执行的点称为入口点。
C语言:
入口点是:
int main(){ .... }
在Python中:
if __name__ == '__main__':
从这一点代码开始执行函数和所有 stuff.So 这称为入口点。
您可能知道,Python 是一种脚本语言,因此程序的执行将从源文件的最顶部开始,一直持续到最后。
因此,如果您使用命令 python mycode.py
执行文件 mycode.py
,执行将从源文件的最顶部开始 mycode.py
但是,这种方法在大型应用程序中带来了一些问题。通常,您 运行 的第一个命令是导入,它基本上是获取其他一些 Python 文件,并执行其中的代码。作为一个实际示例,假设您有 2 个文件 first.py
和 second.py
。 first.py
开始如下:
import second
和second
开头如下:
def a_function():
# do something
然后 Python 看到导入命令 运行s second.py
,并初始化函数 a_function()
以便它现在可以在 first.py
但是 second.py
也可能包含当解释器在文件上 运行 时立即执行的代码,如下所示:
def a_function():
# do something
print("I am called upon execution")
现在我们遇到一个问题:当first.py
导入second.py
时会执行打印语句。
为了解决这个问题,特别是在未来导入的文件中使用了以下措施:
def a_function():
# do something
if __name__ == "__main__":
print("I am executed")
这不像 C 入口点 (int main(){...}
)。事实上,C 编译器会寻找入口点以在代码中的给定点开始执行。
Pyhton interpreted insted 简单地对预定义的全局(__name__
)执行检查。如果变量等于"__main__"
,这是一个非常笼统的解释,这意味着正在执行文件,否则正在导入文件(因此检查失败,代码不执行)。
因此,在您的情况下,只需定义您的功能 (def remove_green_background():
),然后在您的源文件中首先调用它(基本上,第一个命令没有缩进)
我创建了一个 python 程序,它可以简单地从图像中删除绿色背景。
现在我想实现定义为入口点的函数 remove_green_background()
。我搜索过很多网站,也搜索过 Whosebug,但无法理解入口点的工作原理。
所以任何人都可以使用这段代码向我详细解释将这些入口点放在哪里?
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()
老实说,我真的不知道入口点是什么以及为什么需要它。
如果你想让一个函数做你想做的事情,就这样做:
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 这样的库没有这个所谓的 extremely-slow-and-super-bad-loopbased-hsvmanual-extraction_and_transformation-of-background 就可以为你做这件事。忘记你在这里问的,看看openCV。查看 openCV 后,查看名为 cv2.inRange(hsv, lower_red, upper_red)
的 openCV 函数 - 您只需提供 HSV 范围的函数(例如浅绿色和深绿色,它将被删除)。一般来说,这
背景去除或者更确切地说,颜色转换称为 颜色过滤
检查此 link。一切都在这里解释 --what you are looking for--
入口点:代码开始执行的点称为入口点。
C语言:
入口点是:
int main(){ .... }
在Python中:
if __name__ == '__main__':
从这一点代码开始执行函数和所有 stuff.So 这称为入口点。
您可能知道,Python 是一种脚本语言,因此程序的执行将从源文件的最顶部开始,一直持续到最后。
因此,如果您使用命令 python mycode.py
执行文件 mycode.py
,执行将从源文件的最顶部开始 mycode.py
但是,这种方法在大型应用程序中带来了一些问题。通常,您 运行 的第一个命令是导入,它基本上是获取其他一些 Python 文件,并执行其中的代码。作为一个实际示例,假设您有 2 个文件 first.py
和 second.py
。 first.py
开始如下:
import second
和second
开头如下:
def a_function():
# do something
然后 Python 看到导入命令 运行s second.py
,并初始化函数 a_function()
以便它现在可以在 first.py
但是 second.py
也可能包含当解释器在文件上 运行 时立即执行的代码,如下所示:
def a_function():
# do something
print("I am called upon execution")
现在我们遇到一个问题:当first.py
导入second.py
时会执行打印语句。
为了解决这个问题,特别是在未来导入的文件中使用了以下措施:
def a_function():
# do something
if __name__ == "__main__":
print("I am executed")
这不像 C 入口点 (int main(){...}
)。事实上,C 编译器会寻找入口点以在代码中的给定点开始执行。
Pyhton interpreted insted 简单地对预定义的全局(__name__
)执行检查。如果变量等于"__main__"
,这是一个非常笼统的解释,这意味着正在执行文件,否则正在导入文件(因此检查失败,代码不执行)。
因此,在您的情况下,只需定义您的功能 (def remove_green_background():
),然后在您的源文件中首先调用它(基本上,第一个命令没有缩进)