• 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

  • 相关阅读:
    luoguP5162 WD与积木
    maven学习7 settings.xml解析
    mybatis 学习六 MyBatis主配置文件
    mybatis 学习五 动态SQL语句
    mybatis 学习四(下) SQL语句映射文件增删改查、参数、缓存
    mybatis 学习四 (上)resutlMap
    mybatis 学习三 关键文件解析
    spring 学习二 @RequestMapping
    Spring 学习一 @Autowired
    mybatis 学习二 MyBatis简介与配置MyBatis+Spring+MySql
  • 原文地址:https://www.cnblogs.com/burellow/p/3408534.html
Copyright © 2020-2023  润新知