检测图像的主要对象并删除背景

问题描述

我需要检测图像中的主要(前部)汽车,以将其放置在无背景或纯背景的另一幅图像中。 下面是一个示例图片

Original image

我正在使用OpenCV 4在Python 3中进行开发。

我尝试了HaarCascade,但即使在detectMultiScale中使用了许多不同的超级参数,它也无法正常工作:

car_cascade = cv2.CascadeClassifier('./haarcascade/haarcascade_car.xml') 

car_detected = car_cascade.detectMultiScale(img_gray1,2.2,4)

cars_with_detections = np.copy(img1)

for (x,y,w,h) in car_detected:
    cv2.rectangle(cars_with_detections,(x,y),(x+w,y+h),(255,0),5)

plt.figure(figsize=(25,15))
plt.imshow(cars_with_detections)

Haarcascade

解决方法

由于其他红色汽车和杂物,该图像的背景很难去除(在保持汽车形状的同时)。
我尝试了多种方法:模糊(高斯滤波器,盒式滤波器等)。

如果只需要对一个图像执行此操作,而仅将汽车放在另一个图像中,则使用Photoshop和Magic Wand工具可能会更好。

但是,通过GRIP(以图形表示的图像处理)软件进行的实验,我仅通过纯OpenCV处理就可以接近。

这是我的管道: Image Processing Pipeline

原始图片: enter image description here

  1. CV减去(减去汽车的“红色”颜色以获得汽车的深色斑点)
    Red(红色) Subtract

  2. HSV阈值(用于与汽车车身创建蒙版) Threshold

  3. 模糊(模糊HSV阈值以获得更坚实的遮罩) Blur

  4. 查找轮廓(通过模糊的蒙版查找汽车的轮廓) Contours

  5. 遮罩(将遮罩应用于原始图像以获取汽车的像素) Mask

我知道我的代码可能没有达到您期望的结果,但是我希望您感谢我的努力和时间以及我的替代解决方案。

这是link,可下载GRIP

这是link,用于将图像处理管道代码下载为Python文件和GRIP文件