代码之家  ›  专栏  ›  技术社区  ›  Mahdi

删除图像背景,然后调整图像大小

  •  0
  • Mahdi  · 技术社区  · 5 年前

    我有很多问题的答案,但我无法解决这些问题。我多次尝试使用不同的代码来删除这样的图像的背景: With Background

    Without Background

    代码如下:

    img2 = Image.open("foo.jpg")
    c_red, c_green, c_blue = cv2.split(img2)
    img2 = cv2.merge((c_red, c_green, c_blue, mask.astype('float32') / 255.0))
    img.paste(img2,(0,0))
    

    img2 = Image.open("foo.jpg")
    img2 = img2.convert("RGBA")
    datas = img2.getdata()
    
    newData = []
    for item in datas:
        if item[0] == 255 and item[1] == 255 and item[2] == 255:
            newData.append((255, 255, 255, 0))
        else:
            newData.append(item)
    img2.putdata(newData)
    

    或者:

    threshold=100
    dist=5
    img2 = Image.open("foo.jpg")
    img2 = img2.convert("RGBA")
    
    arr=np.array(np.asarray(img2))
    r,g,b,a=np.rollaxis(arr,axis=-1)    
    mask=((r>threshold)
          & (g>threshold)
          & (b>threshold)
          & (np.abs(r-g)<dist)
          & (np.abs(r-b)<dist)
          & (np.abs(g-b)<dist)
          )
    arr[mask,3]=0
    img2=Image.fromarray(arr,mode='RGBA')
    

    但它们都不起作用。我要做的是移除任何颜色的背景(透明的),并将图像的边界更改为其对象的边界,如我上面所示。感谢任何帮助。

    0 回复  |  直到 5 年前
        1
  •  2
  •   nathancy    5 年前

    这里有一种使用OpenCV的方法。这个想法是获得一个二值图像然后使用 cv2.boundingRect 以获得边界矩形坐标。我们可以使用Numpy切片来裁剪图像,然后添加一个alpha通道。结果如下:

    输入图像

    enter image description here

    enter image description here

    提取ROI

    enter image description here

    代码

    import cv2
    import numpy as np
    
    # Load image, convert to grayscale, Gaussian blur, Otsu's threshold
    image = cv2.imread('1.jpg')
    original = image.copy()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (3,3), 0)
    thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    
    # Obtain bounding rectangle and extract ROI
    x,y,w,h = cv2.boundingRect(thresh)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
    ROI = original[y:y+h, x:x+w]
    
    # Add alpha channel
    b,g,r = cv2.split(ROI)
    alpha = np.ones(b.shape, dtype=b.dtype) * 50
    ROI = cv2.merge([b,g,r,alpha])
    
    cv2.imshow('thresh', thresh)
    cv2.imshow('image', image)
    cv2.imshow('ROI', ROI)
    cv2.waitKey()