- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们想对 RGB 图像应用颜色阈值:
当我们指定下限为[0, 0, 0]
上限为 [255, 255, 255]
结果如下:
并且,当下限为 [1, 1, 1]
时上限为[255, 255, 255]
结果如下:
为什么一个像素的差异会在遮蔽上造成如此剧烈的变化?
代码:
lower_blue = np.array([0,0,0])
upper_blue = np.array([255,255,255])
mask = cv2.inRange(image_copy, lower_blue, upper_blue)
plt.imshow(mask,cmap='gray')
最佳答案
您的主要“问题”是 Matplotlib 的 imshow
在这里发挥作用。
在您的第一种情况下,您只需屏蔽图像中的所有像素,以便 mask
中的所有像素有值255
.使用 imshow
时在此类图像上没有任何参数时,将应用自动颜色缩放,从而将相应的绘图设置为 0
对于所有像素,因为所有像素都具有相同的值。如果显式设置 vmin
和 vmax
(参见链接的文档页面)在 imshow
打电话,你会看到预期的全白情节。
第二种情况的细微变化会导致 mask
中的一些像素成为 0
, 这样即使是标准 imshow
调用将产生“正确”的颜色缩放,因为 mask
中的像素覆盖整个“范围”[0 ... 255]
, 因为只有 0
的像素值和 255
.
现在,检测蓝色背景:在你的情况下,蓝色背景似乎有一个固定的 RGB 值,所以使用 OpenCV 的 inRange
使用标准 BGR 图像可能是合适的。一般来说,对于颜色 mask ,将图像转换为 HSV/HSL 颜色空间更为复杂 - 从我的角度来看。对于简短的介绍,选择正确的 H
, S
, L
值,请参阅 this answer我提出了一个较早的问题。
我为上述比较以及实际检测蓝色背景做了一些代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread('8au0O.jpg')
lower_blue = np.array([0, 0, 0])
upper_blue = np.array([255, 255, 255])
mask_lb000 = cv2.inRange(image, lower_blue, upper_blue)
plt.figure()
plt.subplot(2, 3, 1)
plt.imshow(mask_lb000, cmap='gray')
plt.title('imshow without explicit vmin, vmax')
plt.subplot(2, 3, 4)
plt.imshow(mask_lb000, cmap='gray', vmin=0, vmax=255)
plt.title('imshow with explicit vmin, vmax')
lower_blue = np.array([1, 1, 1])
upper_blue = np.array([255, 255, 255])
mask_lb111 = cv2.inRange(image, lower_blue, upper_blue)
plt.subplot(2, 3, 2)
plt.imshow(mask_lb111, cmap='gray')
plt.title('imshow without explicit vmin, vmax')
plt.subplot(2, 3, 5)
plt.imshow(mask_lb111, cmap='gray', vmin=0, vmax=255)
plt.title('imshow with explicit vmin, vmax')
# Detect blue-ish areas in HSL converted image
# H value must be appropriate (see HSL color space), e.g. within [200 ... 260]
# L value can be arbitrary (we want everything between bright and dark blue), e.g. within [0.0 ... 1.0]
# S value must be above some threshold (we want at least some saturation), e.g. within [0.35 ... 1.0]
lower_blue = np.array([np.round(200 / 2), np.round(0.00 * 255), np.round(0.35 * 255)])
upper_blue = np.array([np.round(260 / 2), np.round(1.00 * 255), np.round(1.00 * 255)])
mask_lb = cv2.inRange(cv2.cvtColor(image, cv2.COLOR_BGR2HSV), lower_blue, upper_blue)
plt.subplot(2, 3, 3)
plt.imshow(mask_lb, cmap='gray')
plt.title('imshow without explicit vmin, vmax')
plt.subplot(2, 3, 6)
plt.imshow(mask_lb, cmap='gray', vmin=0, vmax=255)
plt.title('imshow with explicit vmin, vmax')
plt.show()
关于python - 颜色阈值 : Why does mask make a drastic difference according to limits specified?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58538254/
我是一名优秀的程序员,十分优秀!