Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 隔离颜色相似的单个区域的最佳方法是什么?_Python_Python 3.x_Opencv_Cv2 - Fatal编程技术网

Python 隔离颜色相似的单个区域的最佳方法是什么?

Python 隔离颜色相似的单个区域的最佳方法是什么?,python,python-3.x,opencv,cv2,Python,Python 3.x,Opencv,Cv2,我有一张卫星图像,正试图根据它的颜色来隔离一个屋顶。我的计划是在图像中选择一个点的颜色,并从中创建一个稍亮>稍暗的范围(允许基于日光和阴影的变化),并删除除该范围内的颜色以外的所有颜色 然后我只需要保留包含最初选定点的颜色区域 下面是一个示例图像,颜色范围和最终图像,我想实现在photoshop中手动编辑 在下面的脚本中,我还无法将RGB颜色转换为HSV值,从而产生可预测的结果。我尝试过使用python进行绿色筛选的各种指南,例如: 和 我一直在尝试使用以下方法,但遇到了一些问题: img =

我有一张卫星图像,正试图根据它的颜色来隔离一个屋顶。我的计划是在图像中选择一个点的颜色,并从中创建一个稍亮>稍暗的范围(允许基于日光和阴影的变化),并删除除该范围内的颜色以外的所有颜色

然后我只需要保留包含最初选定点的颜色区域

下面是一个示例图像,颜色范围和最终图像,我想实现在photoshop中手动编辑

在下面的脚本中,我还无法将RGB颜色转换为HSV值,从而产生可预测的结果。我尝试过使用python进行绿色筛选的各种指南,例如: 和

我一直在尝试使用以下方法,但遇到了一些问题:

img = cv2.imread("static.jpg".format(latlon, zoom))
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# light color in RGB = [153, 139, 130]
# dark color in RGB = [82, 74, 71]
# How to convert these to HSV?
# using 150,0,0 here as it creates a valid range
hsv_color1 = np.array([150,0,0])

# using 180,255,255 here as it creates a valid range
hsv_color2 = np.array([180,255,255])
mask = cv2.inRange(img_hsv, hsv_color1, hsv_color2)
res = cv2.bitwise_and(img, img, mask = mask)
cv2.imshow('mask', mask)
cv2.imwrite("mask.jpg".format(latlon, zoom), mask)
cv2.imshow('img_hsv', img_hsv)
cv2.imwrite("img_hsv.jpg".format(latlon, zoom), img_hsv)
cv2.imshow('res', res)
cv2.imwrite("res.png".format(latlon, zoom), res)
所以我的两个问题是:

  • 如何将RGB转换为HSV值,从而创建有效的inRange来隔离这些颜色
  • 如何根据给定的像素位置只改变颜色的一个区域
  • 另外,如何使隔离的inRange区域的面具成为一个很好的紧密面具
  • 我需要输出一幅图像,将给定像素位置周围的颜色区域隔离开来

    原创的

    期望输出

    浅色

    深色

    在HSV中,您的暗值变为16/13/32。在HSV中,你的光值变为23/14/60

    OpenCV通过除以2缩放色调值,使360的整个范围变为180,并且仍然适合无符号8位数字。因此,需要使用暗色调值8和亮色调值12。我会在每一端将该范围扩大3-5,以留出一定的余地,并使用较低的饱和度仅拾取不饱和的灰色值。因此,代码变成:

    #!/usr/bin/env python3
    
    import cv2
    import numpy as np
    
    img = cv2.imread("static.jpg")
    img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
    # light color in RGB = [153, 139, 130]
    # dark color in RGB = [82, 74, 71]
    
    hsv_lo = np.array([5,0,0])
    hsv_hi = np.array([15,50,255])
    mask = cv2.inRange(img_hsv, hsv_lo, hsv_hi)
    res = cv2.bitwise_and(img, img, mask = mask)
    cv2.imwrite("result.png", res)
    

    呃,你没有给我们“给定像素位置”。对不起,我的错-例如x:235,y:343。我还试图检测屋顶上每个部分的轮廓。我可以从RGB颜色中获取HSV值:
    python start\r=154 start\u g=141 start\u b=132 end\u r=82 end\u g=74 end\u b=71 start=np.uint8([[[start\u b,start\u g,start\r]])HSV\u start=cv2.tcolor(start,cv2.COLOR\u BGR2HSV)[0][0]end=np uint8([[end\u-b,end\u-g,end\u-r]]hsv_end=cv2.cvt彩色(end,cv2.COLOR_BGR2HSV)[0][0]打印(hsv_开始)打印(hsv_结束)
    但我仍然得到一个空的掩码;(