OpenCV及rembg去除图像背景

OpenCV去除图像背景

去除图像背景,需要综合使用二值化(thresholding)、腐蚀(erosion)、膨胀(dilation)以及位运算(bitwise operations),代码如下:

cpp 复制代码
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>

using namespace cv;

int main(int argc, char** argv)
{
    CommandLineParser parser(argc, argv, "{@input | dog.jpg | input image}");
    // Read an image
    Mat src = imread(samples::findFile(parser.get<String>("@input")));
    if (src.empty())
    {
        std::cout << "Could not open or find the image!\n" << std::endl;
        std::cout << "Usage: " << argv[0] << " <Input image>" << std::endl;
        return EXIT_FAILURE;
    }

    // Convert the image to grayscale
    Mat grayImg;
    cvtColor(src, grayImg, COLOR_BGR2GRAY);

    // Remove the background using a threshold
    // median filter is applied to reduce noise in the image
    // ksize is 5
    Mat grayImgBlurred;
    medianBlur(grayImg, grayImgBlurred, 5);

    // A binary threshold is applied to the grayscale image using a threshold
    Mat binaryImg;
    double thresh = threshold(grayImgBlurred, binaryImg, 150, 255, THRESH_BINARY_INV);

    // Output the thresh
    std::cout << thresh << std::endl;

    // The binary image is eroded to remove small objects and fill in small gaps using erode
    Mat erodedMask;
    erode(binaryImg, erodedMask, getStructuringElement(MORPH_RECT, Size(3, 3)), Point(-1, 1), 2);

    // The binary image is dilated to expand the remaining foreground objects # and fill in gaps using dilate
    Mat mask;
    dilate(erodedMask, mask, getStructuringElement(MORPH_RECT, Size(3, 3)), Point(-1, 1), 2);

    // The original input image is combined with the binary mask using bitwise_and
    Mat backgroundRemovedImg;
    bitwise_and(src, src, backgroundRemovedImg, mask);

    // Display the processed images
    imshow("Background Removed Image", backgroundRemovedImg);
    waitKey(0);

    return EXIT_SUCCESS;
}
python 复制代码
###Background removal is removing the background from an image

import cv2

# Read an image
img = cv2.imread('../data/dog.jpg')
# Convert the image to grayscale
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
# Remove the background using a threshold
# median filter is applied to reduce noise in the image
gray_img = cv2.medianBlur(gray_img, 5)

# A binary threshold is applied to the grayscale image using a threshold
ret, thresh = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY_INV)

# The binary image is eroded to remove small objects and fill in small gaps using erode
mask = cv2.erode(thresh, None, iterations=2)

# The binary image is dilated to expand the remaining foreground objects # and fill in gaps using dilate
mask = cv2.dilate(mask, None, iterations=2)
# The original input image is combined with the binary mask using bitwise_and
background_removed_img = cv2.bitwise_and(img, img, mask=mask)

# Display the processed images 
cv2.imshow('Background Removed Image', background_removed_img)


# Wait for a key press and then close the windows
cv2.waitKey(0)
cv2.destroyAllWindows()

原图:

处理后:

显然,这个结果并不美丽,我们可以尝试修改参数修正,但结果总是难以令人满意。于是采用更好更省事的办法,引用rembg库,调用u2net模型,去除背景。

使用rembg库去除图像背景

rembg库地址为:https://pypi.org/project/rembg/,这是一个基于机器学习模型的库,安装命令如下:

bash 复制代码
pip install rembg

如果有CUDA,可以安装GPU版:

bash 复制代码
pip install rembg[gpu]

使用该库,去除图像背景的代码如下:

python 复制代码
### For background removal using rembg library

from rembg import remove
import cv2

#input path for image
input_path = '../data/dog.jpg'
output_path = 'output.png'

#read the image
input = cv2.imread(input_path)
output = remove(input)
# save the image 
cv2.imwrite(output_path, output)

# Display the processed images 
img = cv2.imread('output.png')
cv2.imshow('Background Removed Image', img)

# Wait for a key press and then close the windows
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果如下:

效果较之于第一种方法,更简洁,当然,安装的包也是很多的。

相关推荐
卡索(CASO)汽车调查几秒前
卡索(CASO)汽车调查:数据智能时代,汽车产业竞争格局与战略升维路径探析
大数据·人工智能·汽车·神秘顾客·汽车密采·神秘人·汽车研究
笨鸟笃行4 分钟前
人工智能备考——2.1.1-2.1.5总结
人工智能·学习
晨非辰7 分钟前
【数据结构】排序详解:从快速排序分区逻辑,到携手冒泡排序的算法效率深度评测
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
能来帮帮蒟蒻吗16 分钟前
深度学习(4)—— Pytorch快速上手!从零搭建神经网络
人工智能·pytorch·深度学习
Blossom.11821 分钟前
大模型知识蒸馏实战:从Qwen-72B到Qwen-7B的压缩艺术
大数据·人工智能·python·深度学习·算法·机器学习·pygame
pingao14137836 分钟前
零启动风速+多参数集成:金属超声波传感器的技术突破
人工智能·科技
wshzd1 小时前
LLM之Agent(二十八)|AI音视频转笔记方法揭秘
人工智能·笔记
IT_陈寒1 小时前
Python 3.12新特性实战:5个让你的代码效率翻倍的隐藏技巧!
前端·人工智能·后端
草莓熊Lotso1 小时前
C++ 二叉搜索树(BST)完全指南:从概念原理、核心操作到底层实现
java·运维·开发语言·c++·人工智能·经验分享·c++进阶
Dfreedom.1 小时前
大模型微调技术全景解析:从基础理论到工程实践
人工智能·大模型微调