我正在尝试从图像中提取红色。我有应用阈值的代码,仅保留指定范围内的值:
img=cv2.imread('img.bmp')
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0,50,50]) #example value
upper_red = np.array([10,255,255]) #example value
mask = cv2.inRange(img_hsv, lower_red, upper_red)
img_result = cv2.bitwise_and(img, img, mask=mask)
但是,正如我检查的那样,红色的色相值可以在0到10的范围内,也可以在170到180的范围内。因此,我想保留这两个范围中任何一个的色相值。我尝试将阈值从10设置为170并使用cv2.bitwise_not()
函数,但随后我也获得了所有白色。我认为最好的选择是为每个范围创建一个遮罩并同时使用它们,因此我必须以某种方式将它们合并在一起,然后再继续。
有没有办法我可以使用OpenCV连接两个蒙版?还是有其他方法可以实现我的目标?
编辑。我带来的不是很多优雅但可行的解决方案:
image_result = np.zeros((image_height,image_width,3),np.uint8)
for i in range(image_height): #those are set elsewhere
for j in range(image_width): #those are set elsewhere
if img_hsv[i][j][1]>=50 \
and img_hsv[i][j][2]>=50 \
and (img_hsv[i][j][0] <= 10 or img_hsv[i][j][0]>=170):
image_result[i][j]=img_hsv[i][j]
它几乎可以满足我的需求,并且OpenCV的功能可能几乎相同,但是如果有更好的方法(使用一些专用功能并编写更少的代码),请与我分享。:)
我只是将蒙版加在一起,并用它np.where
来蒙版原始图像。
img=cv2.imread("img.bmp")
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# lower mask (0-10)
lower_red = np.array([0,50,50])
upper_red = np.array([10,255,255])
mask0 = cv2.inRange(img_hsv, lower_red, upper_red)
# upper mask (170-180)
lower_red = np.array([170,50,50])
upper_red = np.array([180,255,255])
mask1 = cv2.inRange(img_hsv, lower_red, upper_red)
# join my masks
mask = mask0+mask1
# set my output img to zero everywhere except my mask
output_img = img.copy()
output_img[np.where(mask==0)] = 0
# or your HSV image, which I *believe* is what you want
output_hsv = img_hsv.copy()
output_hsv[np.where(mask==0)] = 0
这比遍历图像的每个像素要快得多,可读性也要好得多。
问题内容: 我有这个雕像的形象。 我正在尝试找到雕像上最顶部,最底部,最左侧和最右侧的点。有没有一种方法可以测量每边的边缘以确定雕像上最外面的点?我想得到双方的坐标。我试图使用并获得雕像的轮廓。 问题答案: 这是一种潜在的方法: 将图像转换为灰度和高斯模糊 获取二进制图像的阈值 查找轮廓 获取外部坐标 转换为灰度并模糊图像后,我们阈值以获取二进制图像 现在我们使用找到轮廓。由于OpenCV使用Nu
问题内容: 我想加载彩色图像,将其转换为灰度,然后反转文件中的数据。 我需要的是:遍历OpenCV中的数组并使用此公式更改每个值(这可能是错误的,但对我来说似乎很合理): 但我不明白为什么它不起作用: 我不想做一个显式循环(我想变得更pythonic)。我可以看到,在一张具有白色背景的图像中,它变成了黑色,但是仅此而已,就好像其他颜色并没有太大变化(如果有)。 问题答案: 您几乎做到了。由于您是一
本文向大家介绍在Python中使用OpenCV裁剪图像,包括了在Python中使用OpenCV裁剪图像的使用技巧和注意事项,需要的朋友参考一下 什么是裁剪? 裁剪是从摄影或插图图像中去除不需要的外部区域。该过程通常包括去除图像的某些外围区域,以从图片中去除多余的垃圾,改善其取景,改变纵横比,或使主题与背景突出或分离。 我们将使用 OpenCV-python (cv2)的这些函数, imread()
我想,我很理解函数“cv2.FindOntours(图像、模式、方法)。但我在opencv的一个文档中得到了这个东西轮廓,层次=cv2.FindOntours(thresh,2,1)。我不明白这里2,1的含义以及为什么使用它们。请有人解释一下。
本文向大家介绍如何使用Java OpenCV库查找图像轮廓?,包括了如何使用Java OpenCV库查找图像轮廓?的使用技巧和注意事项,需要的朋友参考一下 轮廓线不过是连接沿着特定形状的边界的所有点的线。使用这个你可以- 查找对象的形状。 计算对象的面积。 检测物体。 识别对象。 您可以使用findContours()方法找到图像中各种形状的轮廓,对象。此方法接受以下参数- 二进制图像。 类型为M
问题内容: 我正在尝试将一张图片与其他图片列表进行比较,并返回该列表中具有最高70%相似度的图片(例如Google搜索图片)。 我在这篇文章中获得了这段代码,并根据自己的情况进行了更改 我的问题是,如何将图像与图像列表进行比较并仅获得相似图像?有什么方法可以做到这一点? 问题答案: 我建议您看一下图像之间推土机的距离(EMD)。该度量给人一种将标准化的灰度图像转换成另一幅图像有多难的感觉,但可以将