如何从图像背景中分割对象 Python OpenCV?

How to segment object from the background of an image Python OpenCV?

我正在尝试将塔与其背景分开。为此,我定义了对象颜色的上限和下限 HSV 范围,如下所示,但它仅将部分对象与其背景分离,因为对象具有两种不同颜色的阴影,即灰色和白色。有没有可能的方法来隔离包含两种不同阴影颜色的对象?

图片是

[![在此处输入图片描述][1]][1]

我使用的代码是:

img = cv2.imread(r'source_img.jpg')
low = np.array([0,0,40])
high = np.array([180,18,230])
hsv = cv2.cvtColor(img,cv2.COLOR_RGB2HSV)
mask = cv2.inRange(hsv,low,high)
masked_img = cv2.bitwise_and(hsv,hsv,mask=mask)

生成的输出图像仅包含部分对象分离。我想把整个塔分开,不包括背景草地、建筑物和天空。

如何只隔离对象塔而没有任何背景?

HSV颜色阈值+两阶段形态学操作

从具有此 lower/upper 范围的 HSV 颜色阈值处理获得的二值图像

lower = np.array([0, 0, 44])
upper = np.array([82, 78, 227])

有不需要的轮廓,所以变形打开。根据图像,您可能需要调整内核大小或迭代次数。

结果

import numpy as np
import imutils
import cv2

# Load image, resize smaller, HSV color threshold
image = cv2.imread('1.jpeg')
image = imutils.resize(image, width=600)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 44])
upper = np.array([82, 78, 227])
mask = cv2.inRange(hsv, lower, upper)

# Remove small noise on mask with morph open
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=3)
smooth_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
opening = cv2.morphologyEx(opening, cv2.MORPH_OPEN, smooth_kernel, iterations=3)
result = cv2.bitwise_and(image, image, mask=opening)
# result[opening==0] = (255,255,255) # Optional for white background 

cv2.imshow('result', result)
cv2.imshow('mask', mask)
cv2.imshow('opening', opening)
cv2.waitKey()

注意: Lower/upper HSV 范围来自 choosing the correct upper and lower HSV boundaries for color detection with cv::inRange (OpenCV)