如何屏蔽深度图以选择图像中最暗的值?

问题描述

我的问题是什么?

我使用 DenseDepth 从单目图像生成了深度图。我的一些结果如下。我需要帮助掩盖深度图中给定范围内最暗的阴影/最暗的灰度值。

我希望能够给出两个十六进制值,即。 #6E6E6E 和 #000000 并为蒙版选择

Hex values in-between #6E6E6E and #000000

间的所有值,然后生成黑白蒙版

我尝试了什么?

经过一番研究,我在这里发现了这个:https://medium.com/@offsouza/segmentando-objetos-pela-cor-opencv-487d5181b473(在 Chrome 上使用谷歌翻译,因为它是西班牙语我认为

这是我在这个特定示例中尝试使用的深度图:

DepthMap used in demo code

这是我使用的python代码

import cv2
import numpy as np

image = cv2.imread('DepthMap.png')
hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
blur = cv2.medianBlur(hsv,11)

lower = np.array([0,35])
upper = np.array([0,44])

mask = cv2.inRange(blur,lower,upper)
res = cv2.bitwise_and(image,image,mask= mask)            

cv2.imshow("mask ",mask)
cv2.imshow('stack',np.hstack([image,res]))
cv2.waitKey(0)

这是代码输出

Output1

Output2

然而,这不允许我给出两个十六进制值,然后选择中间的所有值,而是我需要指定上限值和下限值。为此,我在此处使用了此脚本:https://github.com/offsouza/color-segmentation/blob/master/get_color.py

正如您可能知道的那样,这根本不是最好的结果,因为它不起作用。我在这方面的知识很少,所以如果你能帮助我,我真的很感激!

编辑:这是预期结果的手绘表示:

https://i.ibb.co/n8JkSf3/C051-EAE8-C114-4-E90-8938-25-A8-C79-A4-A7-E.jpg

解决方法

为了更好地解决我的问题并使其在各种深度图上得到推广,我采用了不同的方法来达到相同的目标。

而不是选择上下颜色范围,这在各种图像上进行测试时似乎会产生不一致的结果。我选择改用全局阈值。

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html

我进一步调整了我的代码,以取平均(非主导)灰色阴影,即亮度,并将其除以 2。因此,我将突出显示 25% 的最暗灰色区域,并将其用作我的阈值。这有效地完成了我的目标。

这是我的代码。

import cv2
import numpy as np

# Only for the threshold display
from matplotlib import pyplot as plt

# The Image to be used
image = 'DepthMap.png'

# Finding the average greyscale value
image_bgr = cv2.imread(image,cv2.IMREAD_GRAYSCALE)

# Calculate the mean of each channel
channels = cv2.mean(image_bgr)
# Type Float
thresh = channels[0]/2
#print (thresh)

# Displaying the threshold value

img = cv2.imread(image,0)
img = cv2.medianBlur(img,5)

# If below then black else white 
ret,th1 = cv2.threshold(img,thresh,255,cv2.THRESH_BINARY)


titles = ['Original Image','Global Thresholding']
images = [img,th1]

for i in range(2):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

# Shows single image on its' own
'''
plt.imshow(images[1],'gray')
plt.xticks([]),plt.yticks([])
'''
plt.show()

深度图.png:

DepthMap

输出:

Global Thresholding

为了证明这适用于其他图像,我还在另一个深度图上测试了相同的代码:

输入:

Depth Map Generalisation

输出:

Depth Map Generalisation Output

评估 尽管您可以在两个图像中看到最暗值不同,但算法已经适应并且仍然有效,这意味着这也可以用于视频深度图,不需要不断调整。