我想把一座塔和它的背景区分开.为此,我定义了对象 colored颜色 的上限和下限HSV范围,如下所示,但它仅将部分对象与其背景分离,因为对象有两种不同 colored颜色 的阴影,即灰色和白色.有没有一种可能的方法来分隔包含两种不同 colored颜色 的物体?

图像是

[![在此处输入图像描述][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 color thresholding + two stage morphological operations

通过HSV colored颜色 阈值处理获得的二值图像

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()

choosing the correct upper and lower HSV boundaries for color detection with cv::inRange (OpenCV)个样本中获得Note:个低/高HSV范围

Python相关问答推荐

Pandas 第二小值有条件

抓取rotowire MLB球员新闻并使用Python形成表格

Vectorize多个头寸的止盈/止盈回溯测试pythonpandas

如果值不存在,列表理解返回列表

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

Python虚拟环境的轻量级使用

如何在python polars中停止otherate(),当使用when()表达式时?

ODE集成中如何终止solve_ivp的无限运行

avxspan与pandas period_range

从嵌套的yaml创建一个嵌套字符串,后面跟着点

将scipy. sparse矩阵直接保存为常规txt文件

Polars Group by描述扩展

如何在信号的FFT中获得正确的频率幅值

如何在PythonPandas 中对同一个浮动列进行逐行划分?

Scipy差分进化:如何传递矩阵作为参数进行优化?

按条件计算将记录拆分成两条记录

奇怪的Base64 Python解码

了解如何让库认识到我具有所需的依赖项

为什么在安装了64位Python的64位Windows 10上以32位运行?