Today I will show you how you can remove background from your images.
I'll use numpy, cv2, matplotlib
,
NumPy is the fundamental package for scientific computing in Python. It is a Python library that provides a multidimensional array object, various derived objects (such as masked arrays and matrices), and an assortment of routines for fast operations on arrays, including mathematical, logical, shape manipulation, sorting, selecting, I/O, discrete Fourier transforms, basic linear algebra, basic statistical operations, random simulation and much more.
OpenCV-Python is a library of Python bindings designed to solve computer vision problems.
cv2.imread()
method loads an image from the specified file. If the image cannot be read (because of missing file, improper permissions, unsupported or invalid format) then this method returns an empty matrix.
Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations in Python.
This is our test image:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
import sys
from PIL import Image
img = cv.imread('images/test.jpg', cv.IMREAD_UNCHANGED)
original = img.copy()
l = int(max(5, 6))
u = int(min(6, 6))
ed = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.GaussianBlur(img, (21, 51), 3)
edges = cv.cvtColor(edges, cv.COLOR_BGR2GRAY)
edges = cv.Canny(edges, l, u)
_, thresh = cv.threshold(edges, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
mask = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel, iterations=4)
data = mask.tolist()
sys.setrecursionlimit(10**8)
for i in range(len(data)):
for j in range(len(data[i])):
if data[i][j] != 255:
data[i][j] = -1
else:
break
for j in range(len(data[i])-1, -1, -1):
if data[i][j] != 255:
data[i][j] = -1
else:
break
image = np.array(data)
image[image != -1] = 255
image[image == -1] = 0
mask = np.array(image, np.uint8)
result = cv.bitwise_and(original, original, mask=mask)
result[mask == 0] = 255
cv.imwrite('bg.png', result)
img = Image.open('bg.png')
img.convert("RGBA")
datas = img.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)
img.putdata(newData)
img.save("img.png", "PNG")
This our result, it's not perfect, but the code did a good job.
That's all. Keep coding.
Top comments (2)
Great Article with Lot of information.
Try PixelLib, a Deep learning library for segmentation tasks to remove background.
Thank you. I will try this library, looks pretty good. Thanks for the info.