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快了十倍左右(据说)

    转自:http://blog.csdn.net/lkbwx/article/details/5548416

  • 相关阅读:
    新手第一次联系oracle的碰到的触发器不能创建的问题
    dubbo注册中心占位符无法解析问题(二)
    dubbo注册中心占位符无法解析问题(一)
    .
    Ubuntu16 安装后配置
    TiDB-----使用 TiUP cluster 在单机上模拟生产环境部署步骤
    TiDB 单机安装(在 Linux OS 上部署本地测试环境)
    WPF查找子控件和父控件方法
    Java基础相关
    C++ namespace浅析
  • 原文地址:https://www.cnblogs.com/burellow/p/3408534.html
Copyright © 2011-2022 走看看