Python 如何遮罩深度贴图以选择图像中最暗的值? 我的问题是什么?

Python 如何遮罩深度贴图以选择图像中最暗的值? 我的问题是什么?,python,opencv,image-segmentation,Python,Opencv,Image Segmentation,我已经从单目图像生成了深度贴图,使用。下面是我的一些结果。我需要帮助掩蔽深度贴图中给定范围内最暗的阴影/最暗的灰色值 我希望能够给出两个十六进制值,即6E6E和000000,并为掩码选择介于两者之间的所有值,然后生成一个黑白掩码 我试过什么? 经过一些研究后,我在这里遇到了这样一个问题:我想在谷歌浏览器上使用西班牙语翻译 下面是我在这个特定示例中尝试使用的深度贴图: 以下是我使用的python代码: import cv2 import numpy as np image = cv2.imrea

我已经从单目图像生成了深度贴图,使用。下面是我的一些结果。我需要帮助掩蔽深度贴图中给定范围内最暗的阴影/最暗的灰色值

我希望能够给出两个十六进制值,即6E6E和000000,并为掩码选择介于两者之间的所有值,然后生成一个黑白掩码

我试过什么? 经过一些研究后,我在这里遇到了这样一个问题:我想在谷歌浏览器上使用西班牙语翻译

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

以下是我使用的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,0,35])
upper = np.array([0,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)
这是代码的输出:

但是,这不允许我给出两个十六进制值,然后选择中间的所有值,而是需要指定上限和下限值。为此,我在此处使用了以下脚本:

正如你可能知道的,这根本不是最好的结果,因为它不起作用。我在这个领域的知识很少,所以如果你能帮助我,我将非常感激

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

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

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

我进一步修改了我的代码,以获得平均的非主导灰色阴影,即亮度,并将其除以2。这样,我就可以突出显示25%最暗的灰色区域,并将其用作我的阈值。这有效地完成了我的目标

这是我的密码

DepthMap.png:

输出:

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

输入:

输出:

评价
虽然您可以在两幅图像中看到最暗的值不同,但该算法已经调整并仍然有效,这意味着它也可以用于视频深度贴图,而不需要不断调整。

请问您如何知道这不是正确的结果?请问预期的结果是什么?请问你的十六进制数值的单位是米?你好,马克,是的。十六进制值实际上是颜色值,而不是米,尽管它们表示深度,但它们是任意的,因此很难给出准确的数字。我原以为只有较暗的区域会被遮住,但事实并非如此,即左下角的椅子没有被遮住。谢谢Ag@Mark这里是我想要实现的掩码的手绘表示:您需要理解所复制代码中的上下变量和inRange函数。简单地复制代码并要求他人修复是不好的。深度贴图通常是单通道图像,其中像素亮度值表示距离。所以我的意思是它们不是3通道RGB图像,所以不需要转换RGB2HSV。所以放下那一步。然后看看Christoph建议的inRange函数。如果你有/想要灰度深度图像,为什么要使用cv2.IMREAD\u COLOR?你最好使用cv2.IMREAD_GRAYSCALE,因为这样会更快,占用更少的内存,也意味着你花更少的时间计算通道的平均值,因为你只有一个通道,而不是三个-看看我关于选择正确算法/设计@Mark Jeez的意思,这让它变得更快了——只要看一眼,速度就明显加快了。但愿我像你一样有常识;&这方面的专门知识。决定进入这个领域,对图像处理一无所知,但由于像你这样乐于助人的家伙,我学到了很多东西。
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()