python抠图,grabcut算法

三世轮回 提交于 2019-11-26 12:10:58
一、不同颜色下用python实现抠图# opencv模块import cv2import 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,3cv2.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转化为1mask2 = 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:\untitled\aa\da.png",img)二、同一种颜色下用python实现抠图
from PIL import Imagei = 1j = 1imgPath = r"D:\untitled\aa\test.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")#把图片强制转成RGBprint(data)print(img.putpixel)img.save("resul.png")#保存修改像素点后的图片

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!