鱼C论坛

 找回密码
 立即注册
查看: 4361|回复: 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 | 显示全部楼层
还是放出代码吧
import pygame
from pygame.locals import *
import sys

bg = 32, 141, 240
size = w,h = 950,1150

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

temp = [(1,1),(-1,-1),(1,-1),(-1,1),(0,1),(1,0),(0,-1),(-1,0)]
lst = []
color = 600

def diffuse(a,b):
    global lst,color
    lst= [(a,b)]
    if sum(img.get_at((a,b))[:3])>color:
        img.set_at((a,b),[2,2,2,255])
    while True:
        a,b = lst.pop(0)
        for x,y in temp:
            a1,b1 = a+x,b+y
            if 0<=a1<949 and 0<=b1<1149:
                if sum(img.get_at((a1,b1))[:3])>color:
                    img.set_at((a1,b1),[2,2,2,255])
                    lst.append((a1,b1))
        if len(lst)==0:
            break

while True:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            sys.exit()
        elif e.type == MOUSEBUTTONDOWN:
            if e.button == 1:
                a,b = pygame.mouse.get_pos()
                print(a,b+400)
                print(img.get_at((a,b+400)))
                diffuse(a,b+400)
            if e.button == 2:
                a,b = pygame.mouse.get_pos()
                color = sum(img.get_at((a,b+400))[:3])-5
                print(color)
                print(img.get_at((a,b+400)))
        elif e.type == KEYDOWN:
            if e.key == K_a:
                for i in range(950):
                    for j in range(1150):
                        if img.get_at((i,j))[3] == 0:
                            img.set_at((i,j),(32, 141, 240,255))
                pygame.image.save(img,'副本1.png')
                
    screen.fill(bg)
    screen.blit(img,pos)
    pygame.display.flip()
    clock.tick(40)


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

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

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

for x in range(h):
    for y in range(w):
        if new_data[x,y,0:3].sum() == 6:
                new_data[x,y,3] = 0
                
for x in range(h):
    for y in range(w):
        if new_data[x,y,3] !=0:
            if new_data[x,y,0:3].sum() > 530:
                new_data[x,y,3] = 0
            else:
                break
for x in range(h-1,0,-1):
    for y in range(w-1,0,-1):
        if new_data[x,y,3] !=0:
            if new_data[x,y,0:3].sum() > 530:
                new_data[x,y,3] = 0
            else:
                break

for x in range(h):
    for y in range(w-1,0,-1):
        if new_data[x,y,3] !=0:
            if new_data[x,y,0:3].sum() > 490:
                new_data[x,y,3] = 0
            else:
                break


newimg = Image.fromarray(new_data)
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-11-16 12:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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