精华内容
下载资源
问答
  • img = cv2.imread('example.jpg')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_r...

    img = cv2.imread('example.jpg')

    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

    height = mask.shape[0]

    width = mask.shape[1]

    # iterate over every pixel

    for i in range(height):

    for j in range(width):

    px = mask[i,j]

    print px

    # check if pixel is white or black

    if (px[2] >= 0 and px[2] <= 40):

    In the above example 'px' is a pixel in BGR. I need to convert the value to HSV because I want to check if the pixel is in a certain color range.

    I already tried

    colorsys.rgb_to_hsv(px[2], px[1], px[0})

    which evokes the error: invalid index to scalar variable

    Thanks!

    解决方案

    From the docs:

    # Convert BGR to HSV

    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # define range of blue color in HSV

    lower_blue = np.array([110,50,50])

    upper_blue = np.array([130,255,255])

    # Threshold the HSV image to get only blue colors

    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    You can just convert your whole img to hsv using the built in method:

    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    展开全文
  • openCv RGB到HSV空间的学习

    千次阅读 2014-08-06 20:18:46
    这次我主要说说颜色空间,包括三个方面:RGB颜色空间,HSV颜色空间以及颜色空间的转换 RGB颜色空间介绍: 1:RGB颜色空间简介  三基色原理:大多数的颜色可以通过红、绿、蓝三色按照不同的...

    这次我主要说说颜色空间,包括三个方面:RGB颜色空间,HSV颜色空间以及颜色空间的转换


    RGB颜色空间介绍:


    1:RGB颜色空间简介



             三基色原理:大多数的颜色可以通过红、绿、蓝<数学中基的概念>三色按照不同的比例合成产生,同样绝大多数单色光也可以分解成红绿蓝三种色光


             红绿蓝三基色按照不同的比例相加合成混色称为相加混色。其中一些混色的规律有:


                       红色+绿色 = 黄色


                       绿色+蓝色 = 青色


                       红色+蓝色 = 品红


                       红色+绿色+蓝色 = 白色


                       红色+青色 = 白色


                       绿色+品红 = 白色


                       蓝色+黄色 = 白色


    2:互补光的定义:


             当两种光按照适当比例混合得到白光时,称这两种光为互补光。所以上述的混色规律我们可以得到青色、黄色、品红分别是红色、蓝色、绿色的补色。


     


    3:亮度的定义:


             单色光的亮度强度各不相同,根据人的感受是:绿光最高,红光次之,蓝光最弱,假设得到的白光的强度为100%。如果用Y表示景物的亮度,则通常有:


                       Y= 0.299R + 0.587G + 0.114B


    因为红﹑绿﹑蓝三基色能够合成自然界所有的色彩,因此在电子设备和软件中,经常使用红绿蓝三基色合成五颜六色的图像。用以上的相加混色所表示的颜色模式成为RGB模式


    注意:


    1:CvLoadImage(“”,0)所得到的图像即为灰度单通道图像,所对应的像素即为Y;而与split函数得到的单通道图像R,G,B不一样,但其亮度显示也是按照下图的直线来显示的<即为RGB空间的直线>


    2:三通道图像也可能是灰度图像,当三通道值相等时,所对应的三通道图像就是灰度图像<可以通过以下程序画出来>。即RGB space空间中(0,0,0)和(1,1,1)两线上所有点就是灰度图像—>三通道图不一定是彩色的,彩色图一定是三通道的



    3:单通道图像亮度显示也是通过下图来显示的



    得到上图的代码为:


    #include <iostream>
    #include "cv.h"
    #include "highgui.h"
    #include "cxcore.h"
    using namespace std;
    int main()
    {
    	IplImage *dst = cvCreateImage(cvSize(255, 255), 8, 3);
    	for(int y = dst->height - 1; y >= 0; y--)
    	{
    		cvSet2D(dst, y,  dst->height - y - 1, cvScalar(255-y, 255-y, 255-y));
    	}
    	cvNamedWindow("show");
    	cvShowImage("show", dst);
    	cvWaitKey(0);
    	cvReleaseImage(&dst);
    	cvDestroyWindow("show");
    	return 0;
    }
    





    HSV颜色空间



    H:色调 0°对应红色, 120°对应绿色, 240°对应蓝色---对应不同的颜色 取值范围0~360


    S:饱和度  比若说:红色的纯度,越白纯度越低,取值范围0~1


    V:亮度  比如你穿了一件红色衣服 在白天亮度较高(0~255之间)傍晚或者黄昏就比较低(0~255之间)即多少的光照上去反射出来被看见,取值范围0~255


    如图:


    颜色空间的转换


    用到的核心函数有: cvConvertScale, cvSplit, cvMerge, cvCvtColor


    需要注意的是:由于加载进来图像是uchar,最多只能是255,而opencv正常程序的结构显示H色调都会小于等于180<因为程序知道表示不了360,直接全部缩小到180>,而H色调的取值范围0~360,因此我们需要将图像转换成float类型,而cvConvertScale 可以实现放大缩小偏移同时可以做类型转换;之后我们可以将hsv各通道转换到0~255之间,使用到的函数仍然是cvConvertScale 。最后需要注意的一点是:CvShowImage显示的图像都会被当做RGB颜色空间的图像来处理.


    下面给出这之间范围变化的代码:


    1:没有考虑H(色调)范围的代码,此时H的范围只能在0~180之间。


    代码:



    #include <iostream>
    #include "cv.h"
    #include "highgui.h"
    #include "cxcore.h"
    
    using namespace std;
    
    int main()
    {
    	IplImage *src = cvLoadImage("F:\\tongtong.jpg", 1);
    	IplImage *hsv_img = cvCreateImage(cvGetSize(src), 8 , 3);
    	IplImage *h_img = cvCreateImage(cvGetSize(src), 8, 1);
    	IplImage *s_img = cvCreateImage(cvGetSize(src), 8, 1);
    	IplImage *v_img = cvCreateImage(cvGetSize(src), 8, 1);
    
    	cvCvtColor(src, hsv_img, CV_BGR2HSV);
    	cvSplit(hsv_img, h_img, s_img, v_img, NULL);
    	for(int y = 0; y < hsv_img->height; y++){
    		for(int x = 0; x < hsv_img->width; x++)
    		{
    			cout << cvGetReal2D(h_img, y, x) << " ";
    		}
    		cout << endl;
    	}
    	cvNamedWindow("src", 0);
    	cvShowImage("src", hsv_img);
    	cvWaitKey(0);
    	cvReleaseImage(&src);
    	cvDestroyWindow("src");
    	return 0;
    }
    


    2:将色调H的取值范围转换到0~360之间



    #include <iostream>
    #include "cv.h"
    #include "highgui.h"
    #include "cxcore.h"
    
    using namespace std;
    
    int main()
    {
    	IplImage *src = cvLoadImage("F:\\tongtong.jpg", 1);
    	IplImage *src_float = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F, 3);
    	<span style="color: rgb(255, 0, 0);">cvConvertScale(src, src_float, 1.0, 0.0);
    	IplImage *hsv_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
    	IplImage *h_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
    	IplImage *s_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
    	IplImage *v_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
    </span>
    	cvCvtColor(src_float, hsv_img, CV_BGR2HSV);
    	cvSplit(hsv_img, h_img, s_img, v_img, NULL);
    	for(int y = 0; y < hsv_img->height; y++){
    		for(int x = 0; x < hsv_img->width; x++)
    		{
    			cout << cvGetReal2D(h_img, y, x) << " ";
    		}
    		cout << endl;
    	}
    	cvNamedWindow("src", 0);
    	cvShowImage("src", hsv_img);
    	cvWaitKey(0);
    	cvReleaseImage(&src);
    	cvDestroyWindow("src");
    	return 0;
    }
    

    3:将H,S,V的范围转化到0~255之间


    #include <iostream>
    #include "cv.h"
    #include "highgui.h"
    #include "cxcore.h"
    
    using namespace std;
    
    int main()
    {
    	IplImage *src = cvLoadImage("F:\\tongtong.jpg", 1);
    	IplImage *src_float = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F, 3);
    	cvConvertScale(src, src_float, 1.0, 0.0);
    	IplImage *hsv_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F , 3);
    	IplImage *h_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
    	IplImage *s_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
    	IplImage *v_img = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
    <span style="color: rgb(255, 0, 0);">
    	IplImage *h = cvCreateImage(cvGetSize(src), 8, 1);
    	IplImage *s = cvCreateImage(cvGetSize(src), 8, 1);
    	IplImage *v = cvCreateImage(cvGetSize(src), 8, 1);
    
    	cvCvtColor(src_float, hsv_img, CV_BGR2HSV);
    	cvSplit(hsv_img, h_img, s_img, v_img, NULL);
    	cvConvertScale(h_img, h, (1.0/360)*255, 0.0);
    	cvConvertScale(s_img, s, 255.0, 0.0);  // 因为S的取值范围为0~1
    	cvConvertScale(v_img, v, 1.0, 0.0);</span>
    	for(int y = 0; y < hsv_img->height; y++){
    		for(int x = 0; x < hsv_img->width; x++)
    		{
    			if(cvGetReal2D(h, y, x) > 200)cout << cvGetReal2D(h, y, x) << " ";
    		}
    		cout << endl;
    	}
    	cvNamedWindow("src", 0);
    	cvShowImage("src", hsv_img);
    	cvWaitKey(0);
    	cvReleaseImage(&src);
    	cvDestroyWindow("src");
    	return 0;
    
    }
    


    展开全文
  • Opencv+Python HSV色彩空间

    千次阅读 2018-05-01 13:26:55
    HSV cv2.inRange(src, lowerb, upperb, dst)函数import cv2 import numpy as np cameraCapture = cv2.VideoCapture(0) # ------------------------获取鼠标指令------------------------ clicked = False def on...

    HSV

      

    cv2.inRange(src, lowerb, upperb, dst)函数

    import cv2
    import numpy as np
    
    cameraCapture = cv2.VideoCapture(0)
    
    # ------------------------获取鼠标指令------------------------
    clicked = False
    def onMouse(event, x, y, flags, param):
        global clicked
        if event == cv2.EVENT_LBUTTONUP:
            clicked = True
    cv2.namedWindow("MyWindow")  # 可以省略
    cv2.setMouseCallback("MyWindow", onMouse)
    # cv2.setMouseCallback()是等待获取鼠标输入
    # cv2.waitKey()是等待获取键盘输入,单位毫秒,返回值为:-1(没有键盘按下)、ASCII码(键盘按下)
    
    print("Showing camera feed. Click window or press any key to stop")
    
    success, frame = cameraCapture.read()
    frame = cv2.flip(frame, 1)  # 左右镜像,上下镜像(1和-1)
    
    while success and cv2.waitKey(1) == -1 and not clicked:
    # success==True可以读帧,延迟1ms若键盘无指令则继续下一帧操作,鼠标无指令
    
        cv2.imshow("MyWindow", frame)
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  # 将读取的BGR转换为HSV
        lower = np.array([35, 43, 46])  # 所要检测的像素范围
        upper = np.array([77, 255, 255])  # 此处检测绿色区域
        mask = cv2.inRange(hsv, lowerb=lower, upperb=upper)
        cv2.imshow("mask", mask)
        success, frame = cameraCapture.read()
        frame = cv2.flip(frame, 1)
    
    cv2.destroyAllWindows()
    cameraCapture.release()

    检测示例:

    展开全文
  • opencv】在hsv颜色空间识别区域颜色

    万次阅读 多人点赞 2016-06-20 18:54:57
    大纲 1. hsv颜色空间简介 2. 介绍识别方法 3. 代码实现 4. 检测结果 一、HSV颜色空间  由色调(Hue)、饱和度(Saturation)、亮度(Value)三个分量构成,HSV更接近于人眼的主观感受。

    大纲


    1. hsv颜色空间简介
    2. 为什么是HSV
    3. 识别方法说明
    4. 识别步骤解析(代码片段)
    4. 检测结果


    一、HSV颜色空间


            由色调(Hue)、饱和度(Saturation)、亮度(Value)三个分量构成,HSV更接近于人眼的主观感受。我们可以通过下面的图来展示HSV颜色分布情况:



        使用了下面的matlab程序画出上面的图形,感兴趣的可以仿真一下。程序很简单。

    % 创建hsv分量
    hue        = repmat(linspace(0,1,100),100,1);
    saturation = repmat([linspace(0,1,50) linspace(1,0,50)].',1,100);
    value      = repmat([ones(1,50) linspace(1,0,50)].',1,100);
    % 生成hsv图像
    hsvImage = cat(3,hue,saturation,value); 
    % 转换成rgb图像
    rgbImage = hsv2rgb(hsvImage); 
    
    
    % 构造坐标系
    theta = linspace(0,2*pi,100);  
    Xcor = [zeros(1,100); cos(theta); zeros(1,100)];
    Ycor = [zeros(1,100); sin(theta); zeros(1,100)];
    Zcor = [2.*ones(2,100); zeros(1,100)];
    
    
    surf(Xcor,Ycor,Zcor,rgbImage,'Clipping','on','FaceColor','texturemap','EdgeColor','none');
    axis equal

    二、为什么是HSV


            对于图像而言,识别相应的颜色在RGB空间、HSV空间或者其它颜色空间都是可行的。之所以选择HSV,是因为H代表的色调基本上可以确定某种颜色,再结合饱和度和亮度信息判断大于某一个阈值(这里是40到255)。而RGB由三个分量构成,需要判断每种分量的贡献比例。比如:R = 200, G = 20, B = 30,可以看到R值很大,所以是红色,再看GB值相对较小,可以判断为深红色。但如果变成:R = 200, G = 190, B = 180,实际上颜色已经接近灰色。



    三、识别方法说明


            基本原理很简单,读入图片后,首先转换成HSV颜色空间。然后逐一的判断每个像素是否在一定范围内,并标识出来(是就标识为255,不是就标识为0)。这样就可以用查找轮廓的方式,把每个颜色区域标识出来。


    四、识别步骤解析(代码片段)


    1. 读入待测试图片,并预览。

    	image = imread("test4.png", CV_LOAD_IMAGE_COLOR);
    	if (!image.data)
    	{
    		cout << "Could not open or find the image" << std::endl;
    		getchar();
    		return -1;
    	}
    	imshow("Display image", image);

    2.  默认读入的颜色空间为RGB,这里首先转换成HSV。

    cvtColor(image, hsvImg, COLOR_BGR2HSV);


    3. 指定识别颜色的取值范围,这里大概的分成了R、G、B三种色彩,如果需要识别更多颜色,可以增加取值,也可以调整值的范围,满足特定需要。

    enum colorType{Red = 0, Green, Blue, ColorButt};
    
    const Scalar hsvRedLo( 0,  40,  40);
    const Scalar hsvRedHi(40, 255, 255);
    
    const Scalar hsvGreenLo(41,  40,  40);
    const Scalar hsvGreenHi(90, 255, 255);
    
    const Scalar hsvBlueLo(100,  40,  40);
    const Scalar hsvBlueHi(140, 255, 255);
    
    vector<Scalar> hsvLo{hsvRedLo, hsvGreenLo, hsvBlueLo};
    vector<Scalar> hsvHi{hsvRedHi, hsvGreenHi, hsvBlueHi};
    
    vector<String> textColor{"R", "G", "B"};

     4. 针对每一种颜色,做下面的几个步骤。

    1)在图片中查找相关颜色,并转换成二值图

            // 查找指定范围内的颜色
            inRange(hsvImg, hsvLo[colorIdx], hsvHi[colorIdx], imgThresholded);
            // 转换成二值图
            threshold(imgThresholded, imgThresholded, 1, 255, THRESH_BINARY);
    

    2)将所得的二值图像四边都增加一个像素,再查找轮廓。这样做的一个明显情况是当图像为纯色的时候,整图只有一种颜色的判断。当然可能还有各种情况,需要分别判断。

            copyMakeBorder(imgThresholded, imag_1, 1, 1, 1, 1, BORDER_CONSTANT, 0);
            vector<vector<Point> > contours0;
            vector<Vec4i> hierarchy;
            findContours(imag_1, contours0, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
    

    3) 检查所有的轮廓中心点,如果非0,判断为所需要查找的颜色区域,用文本标记颜色。如蓝色标记为字母‘B’。

            for (int idx = 0; idx < contours0.size(); idx++ )
            {
                Rect bound = boundingRect(Mat(contours0[idx]));
                Point bc = Point(bound.x + bound.width / 2,
                                 bound.y + bound.height / 2);
                uchar x = imgThresholded.at<uchar>(bc);
    
                if (x > 0)
                {
                    org = bc;
                    putText(image, textColor[colorIdx], org, fontFace, 1, color,
                    thickness, lineType, bottomLeftOrigin);
                }
            }

    5. 重复上面步骤,直到所有颜色都识别完毕。


    五、检测结果


            用excel画的颜色图,图中可以看到颜色都正确的标识了。第三行不是没有识别出来,而是字母的颜色与本来的颜色一样,这里懒得设置了。



    展开全文
  • RGB、HSV、YUV 什么是颜色 Wiki是这样说的:颜色或色彩是通过眼、脑和我们的生活经验所产生的一种对光的视觉效应。嗯,简单点说,颜色就是人对光的一种感觉,由大脑产生的一种感觉。感觉是一个很主观的东西,你...
  • 我们有一张包含有不同种颜色球的图片,使用HSV颜色空间对某一种颜色的球做检测 大体框架 import cv2 import numpy as np def nothing(x): pass while True: # 读取的为BGR颜色空间 frame = cv2.imread('...
  • opencv hsv cvtColor颜色空间转换

    千次阅读 2017-05-26 11:06:30
    opencv hsv cvtColor颜色空间转换 RGB 加法原色模型, 以原色组合的方式定义颜色,面向硬件. 三通道图: 每个像素点都有3个值表示,所以就是3通道 通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间...
  • 本文主要讲述了如何在python中使用opencv将RGB图像转换HSV及YCrCb图像,主要使用了cv2库中的cv2.cvtColor()函数,将RGB图像(在opencv中设计BGR图像)转换HSV图像用到了参数cv2.COLOR_BGR2HSV,而转换为YCrCb...
  • OpenCV图像转换

    2020-03-22 19:33:35
    OpenCV图像转换通道和深度通道数深度Mat支持的类型图像读取 imreadconvertTo()cvtColor() 通道和深度 通道数 引用自link 1通道的是灰度图。 3通道的是彩色图像,比如RGB图像。 4通道的图像是RGBA,是RGB加上一个A...
  • 四、OpenCV中的HSV颜色体系 五、OpenCV实战——两种方法使用OpenCV进行颜色分割 六、inRange函数用法介绍 一、HSV颜色系统简介 HSV是一种在人们生活中甚至更常用的颜色系统,在电视遥控器上、在画画的调色板中、...
  • OpenCv中RGB占据三通道,类似于树状结构,每个像素点下面有三个子节点。下面为RGB三通道输出代码以及输出结果: 注:matlab 的排列顺序是R,G,B; 而在opencv中,排列顺序是B,G,R。 代码: #include "highgui.h" #...
  • opencv利用HSV图像进行颜色筛选

    万次阅读 2019-05-24 10:36:27
    基于HSV颜色空间中的像素值范围来检测对象。 原理 在上一个教程中,我们学习了如何使用cv :: threshold函数执行阈值处理。 在本教程中,我们将学习如何使用cv ::inRange函数来完成它。 概念保持不变,但现在我们添加...
  • #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/video.hpp" #include "opencv2/videoio.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc/imgproc_c.h" #include &...
  • opencv-hsv图像分离合并

    2018-11-21 10:56:00
    python3-opencv库(3)--图片颜色空间转换,利用HSV进行物体跟踪,图像通道分离与合并 2018年02月23日 19:36:50giveup_skyland阅读数:1066标签:python3计算机视觉opencv图像处理更多 个人分类:计算机视觉...
  • 之所以说基于opencv,由于转换程序用到了一些OpenCV函数(imread())及数据类型(uchar)。  OpenCV全称:Open Source Computer Vision Library,开源、免费,很好很强大。 帮助文档:...
  • 目录前言RGB与GRAY互相转换RGB与HSV互相转换 前言 经过前面的理论知识介绍,我们已经掌握了各种色彩空间类型。本篇博文主要介绍在OpenCV中,如何用代码实现色彩空间类型的转换。 RGB与GRAY互相转换OpenCV内,我们...
  • 通过HSV色彩空间,我们能够更加方便地通过色调、饱和度和亮度来感知颜色。
  • 然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色调 Hue,饱和度 Saturation,亮度 Value)是根据颜色的直观特性创建的一种颜色空间, 也称六角锥体模型。为什么会选择 HSV 空间而不是 RGB 空间? ...
  • opencv,图像处理,rgb转换hsv空间

    千次阅读 2018-11-28 19:21:38
    图像RGB空间转换HSV空间。 H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。  纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该...
  • 使用Opencv获取每个像素点的RGB颜色分量/HSV颜色分量

    万次阅读 多人点赞 2018-03-27 17:16:47
    一. 所需结构体CvScalar结构体介绍typedef struct ... 所需函数cvGet2D函数功能:获取像素点上的RGB颜色分量,如果是灰度图直接返回灰度图颜色分量函数原型:CvScalar cvGet2D( const CvArr* arr, int idx0, int idx...
  • 利用OpenCVHSV的3D直方图

    千次阅读 2015-08-13 22:34:00
    此代码是根据opencv附带例子修改而成。 [cpp] view plaincopy #include  #include  #include  #include  #include  #include "CommandParser.h"  using namespace std; ...
  • 转换HSV后,ImageWatch中显示的图片,放大到最大后也有三个数字,分别对应H、S、V通道数值。CIE标准一般HSV取值范围为H[0,360°],S[0,1],V[0,1]。但对于计算机来说不太方便,所以openCV采用的方式是,H=H(CIE)/2...
  • #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/video.hpp" #include "opencv2/videoio.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc/imgproc_...
  • #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/video.hpp" #include "opencv2/videoio.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc/imgproc_c.h" #include &...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,094
精华内容 1,237
关键字:

opencv像素转换hsv