鱼C论坛

 找回密码
 立即注册
查看: 4215|回复: 9

[技术交流] 好麻烦的抠图

[复制链接]
发表于 2018-4-7 14:37:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 JAY饭 于 2018-4-7 14:53 编辑

昨天晚上看了一个文字游戏帖子,心血来潮想弄个pygame版,但是找不到合适的png图片只好作罢,这让我开始产生了自己抠图的想法,其实自己本身也学过两个多月的PS,但是还是喜欢自己动手写代码来完成。可惜好的算法根本看不懂,好难受,只能用粗略的算法粗糙的抠下图,而且也无法普及成其他类型的抠图
过程

11.jpg
11.png
鍓湰1.png

评分

参与人数 1荣誉 +6 鱼币 +6 贡献 +6 收起 理由
小甲鱼 + 6 + 6 + 6 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-7 15:11:59 | 显示全部楼层
还是放出代码吧
  1. import pygame
  2. from pygame.locals import *
  3. import sys

  4. bg = 32, 141, 240
  5. size = w,h = 950,1150

  6. screen = pygame.display.set_mode(size,RESIZABLE)
  7. pygame.display.set_caption('抠图')
  8. clock = pygame.time.Clock()
  9. img = pygame.image.load('11.png')
  10. pos = img.get_rect()
  11. pos[0],pos[1] = 0,-400

  12. temp = [(1,1),(-1,-1),(1,-1),(-1,1),(0,1),(1,0),(0,-1),(-1,0)]
  13. lst = []
  14. color = 600

  15. def diffuse(a,b):
  16.     global lst,color
  17.     lst= [(a,b)]
  18.     if sum(img.get_at((a,b))[:3])>color:
  19.         img.set_at((a,b),[2,2,2,255])
  20.     while True:
  21.         a,b = lst.pop(0)
  22.         for x,y in temp:
  23.             a1,b1 = a+x,b+y
  24.             if 0<=a1<949 and 0<=b1<1149:
  25.                 if sum(img.get_at((a1,b1))[:3])>color:
  26.                     img.set_at((a1,b1),[2,2,2,255])
  27.                     lst.append((a1,b1))
  28.         if len(lst)==0:
  29.             break

  30. while True:
  31.     for e in pygame.event.get():
  32.         if e.type == pygame.QUIT:
  33.             sys.exit()
  34.         elif e.type == MOUSEBUTTONDOWN:
  35.             if e.button == 1:
  36.                 a,b = pygame.mouse.get_pos()
  37.                 print(a,b+400)
  38.                 print(img.get_at((a,b+400)))
  39.                 diffuse(a,b+400)
  40.             if e.button == 2:
  41.                 a,b = pygame.mouse.get_pos()
  42.                 color = sum(img.get_at((a,b+400))[:3])-5
  43.                 print(color)
  44.                 print(img.get_at((a,b+400)))
  45.         elif e.type == KEYDOWN:
  46.             if e.key == K_a:
  47.                 for i in range(950):
  48.                     for j in range(1150):
  49.                         if img.get_at((i,j))[3] == 0:
  50.                             img.set_at((i,j),(32, 141, 240,255))
  51.                 pygame.image.save(img,'副本1.png')
  52.                
  53.     screen.fill(bg)
  54.     screen.blit(img,pos)
  55.     pygame.display.flip()
  56.     clock.tick(40)

复制代码



第二段是,直线型自动判断噪点,也想过用广度扩散的方法自动判断,但是会不可避免的影响被抠的图本身,就算了。
  1. from PIL import Image
  2. import numpy as np

  3. img = Image.open('11.pNg').convert('RGBA')
  4. w,h = img.size
  5. data = np.reshape(img,(h,w,4))
  6. new_data = data.copy()
  7. print(new_data[0,0,0:3])

  8. temp = [(0,1),[1,0],(-1,0),(0,-1)]

  9. for x in range(h):
  10.     for y in range(w):
  11.         if new_data[x,y,0:3].sum() == 6:
  12.                 new_data[x,y,3] = 0
  13.                
  14. for x in range(h):
  15.     for y in range(w):
  16.         if new_data[x,y,3] !=0:
  17.             if new_data[x,y,0:3].sum() > 530:
  18.                 new_data[x,y,3] = 0
  19.             else:
  20.                 break
  21. for x in range(h-1,0,-1):
  22.     for y in range(w-1,0,-1):
  23.         if new_data[x,y,3] !=0:
  24.             if new_data[x,y,0:3].sum() > 530:
  25.                 new_data[x,y,3] = 0
  26.             else:
  27.                 break

  28. for x in range(h):
  29.     for y in range(w-1,0,-1):
  30.         if new_data[x,y,3] !=0:
  31.             if new_data[x,y,0:3].sum() > 490:
  32.                 new_data[x,y,3] = 0
  33.             else:
  34.                 break


  35. newimg = Image.fromarray(new_data)
  36. newimg.save('timg2.png','PNG')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-7 14:40:01 | 显示全部楼层
本帖最后由 JAY饭 于 2018-4-7 14:52 编辑

第二张是半成品,最后一张是PNG格式,也就是透明的,但是效果还是很不好,反正就是没有渲染效果,可惜以我现在的水平,这个效果只能说达到自己的上限。贝叶斯方法的抠图奈何真的看不懂,很难受,代码就不放了,很渣,思路是这样的,一个是pygame的选择目标点,扩散式染色,一个是用image模块,从左右上下四个方向修图。

重新改了下图片,把第三张合成了,这样可以看到明显的缺点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 14:49:37 From FishC Mobile | 显示全部楼层
牛逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-4-7 14:54:22 | 显示全部楼层

大神你真的过奖,很简单的思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-7 14:57:53 | 显示全部楼层
但是对付一些简单的图片还是绰绰有余,第二张是处理后的png,比如
12.jpg timg1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-7 17:16:50 | 显示全部楼层
本帖最后由 清风揽月shine 于 2018-4-7 17:22 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-7 20:28:20 | 显示全部楼层
大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-8 01:12:15 | 显示全部楼层
哟哟哟,帅哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-8 01:23:01 | 显示全部楼层

谢谢鼓励,惊了,自我感觉写的很差劲的。
       对了,上面的代码是我后期改动了的,随手贴上去的部分,所以,并不能实现完整抠图过程,我觉得像我写的这个代码也没什么好看的,看不看都不重要,最重要的还是贯穿解决问题的逻辑思路。多动脑~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-18 12:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表