zoukankan      html  css  js  c++  java
  • python抠图,grabcut算法

    一、不同颜色下用python实现抠图
    # opencv模块
    import cv2
    import numpy as np

    # Step1. 加载图像
    img = cv2.imread('D:\untitled\aa\img.png')

    # Step2. 创建掩模、背景图和前景图
    # mask返回一堆0,1,2,3的数组,shape[:2]形状切分宽和高,zeros创建0,0,0的数组
    mask = np.zeros(img.shape[:2], np.uint8) # 创建大小相同的掩模
    bgdModel = np.zeros((1,65), np.float64) # 创建背景图像
    fgdModel = np.zeros((1,65), np.float64) # 创建前景图像

    # Step3. 初始化矩形区域
    # 这个矩形必须完全包含前景(相当于这里的梅西)
    # rect = (50,50,450,290)
    # rect = (275, 120, 170, 320)
    # rect = (x,y,w,h) x:左边距,y:上边距,w:宽,h:高
    rect = (60,110,300,300)
    # Step4. GrubCut算法,迭代5次
    # mask的取值为0,1,2,3
    cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT) # 迭代5次
    # cv2.GC_INIT_WITH_RECT:默认为0,表示框出的矩形图案
    # Step5. mask中,值为2和0的统一转化为0, 1和3转化为1
    mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
    img = img * mask2[:,:,np.newaxis] # np.newaxis 插入一个新维度,相当于将二维矩阵扩充为三维

    # cv2.imshow("dst", img)
    cv2.waitKey(0)
    cv2.imwrite(r"D:untitledaada.png",img)


    二、同一种颜色下用python实现抠图
    from PIL import Image

    i = 1
    j = 1
    imgPath = r"D:untitledaa est.png"#.jpeg";
    # faZhi = 70#绿色

    #imgPath = "/Users/guoanguan/Desktop/kouTu/beiKou.jpeg"
    #faZhi = 5#白色

    img = Image.open(imgPath)#读取系统的内照片

    img = img.convert('RGBA')
    print (img.size)#打印图片大小
    print (img.getpixel((4,4)))

    width = img.size[0]#长度
    height = img.size[1]#宽度

    for i in range(0,width):#遍历所有长度的点
    for j in range(0,height):#遍历所有宽度的点
    data = (img.getpixel((i,j)))#打印该图片的所有点
    #print (data)#打印每个像素点的颜色RGBA的值(r,g,b,alpha)
    #print (data[0])#打印RGBA的r值

    #抠掉白色
    # targetColor = [245, 245, 247]
    ##targetColor = [49, 166, 64]
    # if isEqualNumbers( data[0], targetColor[0]) and isEqualNumbers( data[1],targetColor[1]) and isEqualNumbers( data[2],targetColor[2]):
    # img.putpixel((i,j), (0,0,0,0))

    #抠掉绿色
    if data[0] < data[1] and data[2] < data[1] and data[1] > 100:
    img.putpixel((i,j), (0,0,0,0))

    # if (data[0]>=170 and data[1]>=170 and data[2]>=170):#RGBA的r值大于170,并且g值大于170,并且b值大于170
    # img.putpixel((i,j),(234,53,57,255))#则这些像素点的颜色改成大红色
    #img = img.convert("RGB")#把图片强制转成RGB
    print(data)
    print(img.putpixel)
    img.save("resul.png")#保存修改像素点后的图片




  • 相关阅读:
    项目代码风格要求
    命名规范
    五招四十二式
    PMBok项目管理
    敏捷软件开发要点
    设计一种前端数据延迟加载的jQuery插件(2)
    为什么Java byte 类型的取值范围是-128~127 (转)
    Xcode编译时出现cannot run using the selected device提示
    mac下的常用操作
    iOS用AVAudioPlayer播放m4a音频
  • 原文地址:https://www.cnblogs.com/xuezhihao/p/11319176.html
Copyright © 2011-2022 走看看