zoukankan      html  css  js  c++  java
  • opencv 中对一个像素的rgb值进行操作的几个常用小办法

    You can access the Image pixels in many ways:
    1. One using the Inbuilt macro
    2. One using the pointer to the image data
    3. Getting the raw data from the image.

    ============================================================
    Method 1: Using Inbuilt macro:
    CV_IMAGE_ELEM( image_header, elemtype, y, x_Nc )

    Suppose, we have 8-bit 1-channel image I (IplImage* img):

    I(x,y) ~ CV_IMAGE_ELEM( img, uchar, y, x);

    Suppose, we have 8-bit 3-channel image I (IplImage* img):

    I(x,y)blue ~ CV_IMAGE_ELEM( img, uchar, y, x*3);
    I(x,y)green ~ CV_IMAGE_ELEM( img, uchar, y, x*3+1);
    I(x,y)red ~ CV_IMAGE_ELEM( img, uchar, y, x*3+2);

    ============================================================

    Method 2: Using pointer to the image data:

    Suppose, we have 8-bit 1-channel image I (IplImage* img):

    I(x,y) ~ ((uchar*)(img->imageData + img->widthStep*y))[x]

    Suppose, we have 8-bit 3-channel image I (IplImage* img):

    I(x,y)blue ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3]
    I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1]
    I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2]

    ============================================================

    Method 3: Using the raw data:
    uchar *data;
    cvGetRawData(img, (uchar**)&data);

    I(x, y) = data[x*img->Width + y]

    对于rgb图像

    读入像素RGB

    int B = CV_IMAGE_ELEM(img, unsigned char, row, col*3+0);
    int G = CV_IMAGE_ELEM(img, unsigned char, row, col*3+1);
    int R = CV_IMAGE_ELEM(img, unsigned char, row, col*3+2);



    写入像素RGB

            CV_IMAGE_ELEM(img, unsigned char, row, col*3+0) = 90;

    CV_IMAGE_ELEM(img, unsigned char, row, col*3+1) = 90;

    CV_IMAGE_ELEM(img, unsigned char, row, col*3+2) = 90;

    修改单个像素,再说得详细点,

    1.3通道时:CV_IMAGE_ELEM(image, unsigned char, i, j*3+k) = gray_val;            //0<=k<3

    2.单通道时:CV_IMAGE_ELEM(image, unsigned char, i, j) = gray_val;

    3.通用方法:CvScalar s;
                     s=cvGet2D(img,i,j); // get the (i,j) pixel value

                     s.val[0]=111;         //单通道就只有这个有效
                     s.val[1]=111;
                     s.val[2]=111;
                     cvSet2D(img,i,j,s);//set the (i,j) pixel value

    CV_IMAGE_ELEM的方法比cvGet2D,cvSet2D快了十倍左右(据说)

  • 相关阅读:
    《精通C#》委托与事件(10章)
    正则
    h5的formData 上传文件及.net后台
    img显示文件对象
    用div 画出三角形
    父元素有border-radius时,overflow 失效
    HTML标签文本内容正常显示而不被解析
    css 从简单到复杂的动态效果,你值得拥有
    在$.post()函数外 使用$.post()返回函数的数据
    jquery工作积累
  • 原文地址:https://www.cnblogs.com/CVArt/p/2503478.html
Copyright © 2011-2022 走看看