当前位置:   article > 正文

使用python完成抠图,调整大小,设置背景_python怎么扣除人像最好用

python怎么扣除人像最好用

之前只花了几个小时就搞出来了, 也是 一时 兴起, 这一块并未涉足。虽然当时也做了相关的记录,并且在第二次 完成相关的操作时,也有参照之前的记录,但是最后居然花了 两天多的时间才完成。

以下为第一次完成后所作的操作。(纯python 代码,加上若干注释,第二次操作时,我是没有完成的。)

  1. #抠图
  2. import paddlehub as hub
  3. output_path = 'output'
  4. module = hub.Module(name="deeplabv3p_xception65_humanseg")
  5. input_dict = {"image": photo_path}
  6. results = module.segmentation(data=input_dict,visualization=True, output_dir=output_path)
  7. from PIL import Image, ImageDraw
  8. WIDTH_1IN = 295
  9. HEIGHT_1IN = 413
  10. #WIDTH_2IN = 413
  11. #HEIGHT_2IN = 626
  12. WIDTH_2IN = 480
  13. HEIGHT_2IN = 640
  14. WIDTH_5IN = 1500
  15. HEIGHT_5IN = 1050
  16. ### 非全景6寸照片
  17. WIDTH_6IN = 1950
  18. HEIGHT_6IN = 1300
  19. def cut_photo(photo, choice):
  20. width = photo.size[0] # 宽
  21. height = photo.size[1] # 高
  22. rate = height / width
  23. if choice == 1:
  24. if rate < (HEIGHT_1IN / WIDTH_1IN):
  25. x = (width - int(height / HEIGHT_1IN * WIDTH_1IN)) / 2
  26. y = 0
  27. cutted_photo = photo.crop((x, y, x + (int(height / HEIGHT_1IN * WIDTH_1IN)), y + height))
  28. else:
  29. x = 0
  30. y = (height - int(width / WIDTH_1IN * HEIGHT_1IN)) / 2
  31. cutted_photo = photo.crop((x, y, x + width, y + (int(width / WIDTH_1IN * HEIGHT_1IN))))
  32. return cutted_photo
  33. if choice == 2:
  34. if rate < (HEIGHT_2IN / WIDTH_2IN):
  35. x = (width - int(height / HEIGHT_2IN * WIDTH_2IN)) / 2
  36. y = 0
  37. cutted_photo = im.crop((x, y, x + (int(height / HEIGHT_2IN * WIDTH_2IN)), y + height))
  38. else:
  39. x = 0
  40. y = (height - int(width / WIDTH_2IN * HEIGHT_2IN)) / 2
  41. cutted_photo = im.crop((x, y, x + width, y + (int(width / WIDTH_2IN * HEIGHT_2IN))))
  42. return cutted_photo
  43. def resize_photo(photo, choice):
  44. '''
  45. 缩放照片
  46. :param photo: 待处理的照片
  47. :param choice: <int> 1代表1寸,2代表2寸
  48. :return: 处理后的照片
  49. '''
  50. if choice == 1:
  51. resized_photo = photo.resize((WIDTH_1IN, HEIGHT_1IN))
  52. return resized_photo
  53. if choice == 2:
  54. resized_photo = photo.resize((WIDTH_2IN, HEIGHT_2IN))
  55. return resized_photo
  56. path='C:\\Users\lws\Desktop'
  57. import os
  58. os.chdir("C:\\Users\lws\Desktop")
  59. im = Image.open("lws.jpg")
  60. width = im.size[0]
  61. height = im.size[1]
  62. rate = height / width
  63. im=resize_photo(cut_photo(im, 2), 2)
  64. im.save('lws2.png')
  65. #抠图 ok
  66. #换底
  67. from PIL import Image
  68. import os
  69. path='C:\\Users\lws\Desktop'
  70. os.chdir(path)
  71. #定义证件照底色RGB值
  72. blue = 0,191,243
  73. red = 255,0,0
  74. white =255,255,255
  75. #底色默认值
  76. color = 0,0,0
  77. your_choice=input("你想要的证件照底色")
  78. if your_choice =="red":
  79. color = red
  80. elif your_choice == "white":
  81. color = white
  82. elif your_choice == "blue":
  83. color = blue
  84. else:
  85. color=white
  86. print("颜色不正确,默认白")
  87. #填充图片A通道,即透明部分
  88. img_path=['lws2.png']
  89. img =Image.open(img_path[0])
  90. finish_path = img_path[0]+"_finish2.png"
  91. x, y = img.size
  92. p = Image.new('RGBA', img.size, (color))
  93. p.paste(img, (0, 0, x, y), img)
  94. p.save(finish_path)

这次的记录如下,经过几天摸索, 发现完成抠图, 的方法很多, 比如使用opencv ,但这里使用的是paddle  来完成。这里抠的图也只是人像相关的。毕竟我只是需要一张蓝底的照片。

第一步 抠图(比如抠出人像)

  1. import paddlehub as hub
  2. import os
  3. output_path = 'C:/Users/lws/Desktop/output' # 设定抠图完成后存放路径
  4. path="C:/Users/lws/Desktop/in_put/" # 设定要处理的图片目录
  5. files= [path + i for i in os.listdir(path)] # 获取要处理的图片的绝对路径
  6. module = hub.Module(name="deeplabv3p_xception65_humanseg") # 加载人像识别库(我是这么理解的,所以类似的库很多)
  7. results = module.segmentation(data={'image':files},visualization=True, output_dir=output_path) # 调用人像识别对象的方法来处理图片列表,并将处理后的图片输出到指定目录

以下为完成抠图的软件环境,python版本也许不那么重要,paddlehub 1.8.0  paddlepaddle 1.8.5 必须得这两个版本。

 第二步 调整处理后图片的大小为自己需要的大小, 我这里需要的是 480 X 640 

代码如下

  1. from PIL import Image, ImageDraw
  2. WIDTH_1IN = 295
  3. HEIGHT_1IN = 413
  4. #WIDTH_2IN = 413
  5. #HEIGHT_2IN = 626
  6. WIDTH_2IN = 480
  7. HEIGHT_2IN = 640
  8. WIDTH_5IN = 1500
  9. HEIGHT_5IN = 1050
  10. ### 非全景6寸照片
  11. WIDTH_6IN = 1950
  12. HEIGHT_6IN = 1300
  13. def cut_photo(photo, choice):
  14. width = photo.size[0] # 宽
  15. height = photo.size[1] # 高
  16. rate = height / width
  17. if choice == 1:
  18. if rate < (HEIGHT_1IN / WIDTH_1IN):
  19. x = (width - int(height / HEIGHT_1IN * WIDTH_1IN)) / 2
  20. y = 0
  21. cutted_photo = photo.crop((x, y, x + (int(height / HEIGHT_1IN * WIDTH_1IN)), y + height))
  22. else:
  23. x = 0
  24. y = (height - int(width / WIDTH_1IN * HEIGHT_1IN)) / 2
  25. cutted_photo = photo.crop((x, y, x + width, y + (int(width / WIDTH_1IN * HEIGHT_1IN))))
  26. return cutted_photo
  27. if choice == 2:
  28. if rate < (HEIGHT_2IN / WIDTH_2IN):
  29. x = (width - int(height / HEIGHT_2IN * WIDTH_2IN)) / 2
  30. y = 0
  31. cutted_photo = im.crop((x, y, x + (int(height / HEIGHT_2IN * WIDTH_2IN)), y + height))
  32. else:
  33. x = 0
  34. y = (height - int(width / WIDTH_2IN * HEIGHT_2IN)) / 2
  35. cutted_photo = im.crop((x, y, x + width, y + (int(width / WIDTH_2IN * HEIGHT_2IN))))
  36. return cutted_photo
  37. def resize_photo(photo, choice):
  38. '''
  39. 缩放照片
  40. :param photo: 待处理的照片
  41. :param choice: <int> 1代表1寸,2代表2寸
  42. :return: 处理后的照片
  43. '''
  44. if choice == 1:
  45. resized_photo = photo.resize((WIDTH_1IN, HEIGHT_1IN))
  46. return resized_photo
  47. if choice == 2:
  48. resized_photo = photo.resize((WIDTH_2IN, HEIGHT_2IN))
  49. return resized_photo
  50. path='C:\\Users\lws\Desktop\output'
  51. import os
  52. os.chdir("C:\\Users\lws\Desktop\output")
  53. im = Image.open("lws2.png")
  54. width = im.size[0]
  55. height = im.size[1]
  56. rate = height / width
  57. im=resize_photo(cut_photo(im, 2), 2)
  58. im.save('lws23.png')
  59. #抠图 ok

#需要安装  Pillow

 第三步 将调整后的图片 和设置的 背景粘贴在一起,

代码如下

  1. from PIL import Image
  2. import os
  3. path='C:\\Users\lws\Desktop\output'
  4. os.chdir(path)
  5. #定义证件照底色RGB值
  6. blue = 0,191,243
  7. red = 255,0,0
  8. white =255,255,255
  9. #底色默认值
  10. color = 0,0,0
  11. your_choice=input("你想要的证件照底色")
  12. if your_choice =="red":
  13. color = red
  14. elif your_choice == "white":
  15. color = white
  16. elif your_choice == "blue":
  17. color = blue
  18. else:
  19. color=white
  20. print("颜色不正确,默认白")
  21. #填充图片A通道,即透明部分
  22. img_path=['lws23.png'] # 抠出来的图像,并已经调整了大小
  23. img =Image.open(img_path[0]) # 打开这个图片对象
  24. finish_path = img_path[0]+"_finish2.png"
  25. x, y = img.size
  26. p = Image.new('RGBA', img.size, (color)) # 创建新的特定大小背景,
  27. p.paste(img, (0, 0, x, y), img) # 使用 新创建的 背景对象,完成粘贴, 这里为什么 两次用img 对象 我也不太明白。
  28. p.save(finish_path) # 调用图片对象的保存方法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/273865
推荐阅读
相关标签
  

闽ICP备14008679号