精华内容
下载资源
问答
  • opencv访问图像像素

    2017-06-29 10:12:39
    opencv访问图像像素 访问图像像素   (1)假设你要访问第k通道、第i行、第j列的像素。   (2)间接访问: (通用,但效率低,可访问任意格式的图像) 对于单通道字节型图像: IplImage* img=cvCreateImage(cvSize...

    opencv访问图像像素

    访问图像像素

     

    (1)假设你要访问第k通道、第i行、第j列的像素。

     

    (2)间接访问: (通用,但效率低,可访问任意格式的图像)

    对于单通道字节型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

    CvScalar s;

    s=cvGet2D(img,i,j); // get the (i,j) pixel value

    printf("intensity=%f\n",s.val[0]);

    s.val[0]=111;

    cvSet2D(img,i,j,s); // set the (i,j) pixel value

    对于多通道字节型/浮点型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

    CvScalar s;

    s=cvGet2D(img,i,j); // get the (i,j) pixel value

    printf("B=%f,G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);

    s.val[0]=111;

    s.val[1]=111;

    s.val[2]=111;

    cvSet2D(img,i,j,s); // set the (i,j) pixel value

     

    (3)直接访问: (效率高,但容易出错)

    对于单通道字节型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

    ((uchar *)(img->imageData + i*img->widthStep))[j]=111;

    对于多通道字节型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

    ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 0]=111; // B

    ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 1]=112; // G

    ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 2]=113; // R

    对于多通道浮点型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

    ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 0]=111; // B

    ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 1]=112; // G

    ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels+ 2]=113; // R

     

    (4)基于指针的直接访问: (简单高效)

    对于单通道字节型图像:

    IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

    int height    = img->height;

    int width     = img->width;

    int step      = img->widthStep/sizeof(uchar);

    uchar* data   = (uchar *)img->imageData;

    data[i*step+j] = 111;

    对于多通道字节型图像:

    IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

    int height    = img->height;

    int width     = img->width;

    int step      = img->widthStep/sizeof(uchar);

    int channels  = img->nChannels;

    uchar* data   = (uchar *)img->imageData;

    data[i*step+j*channels+k] = 111;

    对于多通道浮点型图像(假设图像数据采用4字节(32位)行对齐方式):

    IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

    int height    = img->height;

    int width     = img->width;

    int step      = img->widthStep/sizeof(float);

    int channels  = img->nChannels;

    float * data   = (float *)img->imageData;

    data[i*step+j*channels+k] = 111;

     

    (5)基于 c++wrapper 的直接访问: (更简单高效)

    首先定义一个 c++ wrapper ‘Image’,然后基于Image定义不同类型的图像:

    template class Image

    {

      private:

      IplImage*imgp;

      public:

      Image(IplImage*img=0) {imgp=img;}

      ~Image(){imgp=0;}

      voidoperator=(IplImage* img) {imgp=img;}

      inline T*operator[](const int rowIndx) {

        return ((T*)(imgp->imageData + rowIndx*imgp->widthStep));}

    };

     

    typedef struct{

      unsigned charb,g,r;

    } RgbPixel;

     

    typedef struct{

      float b,g,r;

    } RgbPixelFloat;

     

    typedef Image       RgbImage;

    typedef Image  RgbImageFloat;

    typedef Image  BwImage;

    typedef Image          BwImageFloat;

    对于单通道字节型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

    BwImage imgA(img);

    imgA[i][j] = 111;

    对于多通道字节型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

    RgbImage imgA(img);

    imgA[i][j].b = 111;

    imgA[i][j].g = 111;

    imgA[i][j].r = 111;

    对于多通道浮点型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

    RgbImageFloat imgA(img);

    imgA[i][j].b = 111;

    imgA[i][j].g = 111;

    imgA[i][j].r = 111;

    展开全文
  • OpenCV访问图像像素

    2020-10-07 14:34:43
    saturate_cast用于防止数据溢出。 优质博客: ...utm_term=opencv%E5%83%8F%E7%B4%A0%E8%A1%A8%E7%A4%BA&a

    saturate_cast用于防止数据溢出。
    优质博客:

    https://blog.csdn.net/stack_moon/article/details/82285403?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allbaidu_landing_v2~default-1-82285403.nonecase&utm_term=opencv%E5%83%8F%E7%B4%A0%E8%A1%A8%E7%A4%BA&spm=1000.2123.3001.4430

    遍历单通道图像的像素:

         for (int i = 0; i < dstImage.rows - 1; i++)
         {
             for (int j = dstImage.cols - 2; j > 1; j--)
             {
                 if (dstImage.at<uchar>(i, j) == dstImage.at<uchar>(i, j - 1))
                     continue;
                 else       //遇到了白色
                 {        
                     x.push_back(j);
                     y.push_back(i);
                     break;     //已经找到间断点,跳出循环
                 }
             }
         }
    

    遍历三通道图像的像素:

        Mat BinRGBImg = srcImage.clone();	//用双重循环给此MAT赋值
    	unsigned char pixelB, pixelG, pixelR;
    	for (int i = 0; i < srcImage.rows; i++)   //通过颜色分量将图片进行二值化处理
    	{
    		for (int j = 0; j < srcImage.cols; j++)
    		{
    			pixelB = srcImage.at<Vec3b>(i, j)[0]; //获取图片各个通道的值
    			pixelG = srcImage.at<Vec3b>(i, j)[1];
    			pixelR = srcImage.at<Vec3b>(i, j)[2];
    
    			// 用PS读取各像素点RGB通道值,可得知圆R、G、B范围
    			if (pixelB < 95 && pixelB>45 && pixelR < 70 && pixelR>45)
    			{                                           //将各个通道的值和各个通道阈值进行比较
    				BinRGBImg.at<Vec3b>(i, j)[0] = 255;     //符合颜色阈值范围内的设置成白色
    				BinRGBImg.at<Vec3b>(i, j)[1] = 255;
    				BinRGBImg.at<Vec3b>(i, j)[2] = 255;
    			}
    			else
    			{
    				BinRGBImg.at<Vec3b>(i, j)[0] = 0;        // 不符合颜色阈值范围内的设置为黑色
    				BinRGBImg.at<Vec3b>(i, j)[1] = 0;
    				BinRGBImg.at<Vec3b>(i, j)[2] = 0;
    			}
    		}
    	}
    
    展开全文
  • Opencv访问图像像素

    2017-07-28 18:41:04
    1.图像存储方式图像在...2.访问图像像素方式2.1 Mat 的at方法at(i,j)[k]的方式访问,其中i,j表示图像的行列,k表示通道数,RGB图像有三个通道,分别是0,1,2。如不需要访问图像每个通道,可以直接访问图像像素,则可用

    1.图像存储方式

    图像在内存中的存储方式是连续的,每列连续存储RGB三个通道,可以用isContinuous()函数判断是否连续存储。下图为灰度图和彩色图的存储结构。
    Gray
    RGB

    2.访问图像像素方式

    2.1 Mat 的at方法

    at< Vec3b >(i,j)[k]的方式访问,其中i,j表示图像的行列,k表示通道数,RGB图像有三个通道,分别是0,1,2。如不需要访问图像每个通道,可以直接访问图像像素,则可用: at< uchar >(i,j) 方式直接去除图像特定行列的像素值。
    注:图像的像素点的灰度值类型必须为 uchar (unsigned char),因为char: -128~127; uchar: 0~255。如果定义为char类型,在不需要对图像像素进行运算的时候是没问题的,但是一旦进行像素运算就有可能出错,为了避免出错,要习惯使用 uchar类型。
    特别的:OpenCV定义了一个Mat的模板子类为Mat_,它重载了operator()让我们可以更方便的取图像上的点。

    Mat_<uchar> im=outputImage;
    im(i,j)=im(i,j)/div*div+div/2;
    2.2指针法

    Mat 的 uchar*p = ptr(i)的方式可以取出图像的行指针,这样访问图像数据的时候就可以遍历每行使用p[j]取出图像特定行列的像素值。
    该方法速度最快,效率最高,但是有可能出现越界问题。

    2.3迭代法

    采用 Mat_< Vec3b >::iterator it; 的方式声明一个迭代器,该方法比较安全,不会越界,但是效率低。

    上述方法的代码例子如下:

    /*
    主函数,声明了一个void colorReduce()函数,该函数分别用三种方式访问图像像素,运行例子的时候将不用的函数注释掉即可。
    颜色空间缩减
    对于三通道图像,一个像素对应的颜色有一千六百多万种,用如此多的颜色可能会影响算法性能。颜色空间缩减即用颜色中具有代表性的一部分表示相近颜色,做法是:将现有颜色空间值除以某个输入值,以获得较少的颜色数。对每个像素进行乘除操作也需要浪费一定的时间(加,减,赋值等代价较低),对于较大的图像,可以预先计算所有可能的值,建立 look up table
    该例子没有采用查找表,而是直接对每个像素进行乘除操作,方便理解图像访问方式。
    */
    #include <opencv2/opencv.hpp>    
    #include<iostream>  
    using namespace std;  
    using namespace cv;  
    void colorReduce(Mat& inputImage, Mat& outputImage, int div);  
    
    int main()  
    {  
    
        Mat srcImage = imread("D:\\vvoo\\lena.jpg");  
        imshow("原始图像", srcImage); 
        Mat dstImage;  
        dstImage.create(srcImage.rows, srcImage.cols, srcImage.type());//效果图的大小、类型与原图片相同   
    
        //记录起始时间  
        double time0 = static_cast<double>(getTickCount());  
        //调用颜色空间缩减函数  
        colorReduce(srcImage, dstImage, 128);  
        //计算运行时间并输出  
        time0 = ((double)getTickCount() - time0) / getTickFrequency();  
        cout << "此方法运行时间为: " << time0 << "秒" << endl;  //输出运行时间  
        //显示效果图  
        imshow("效果图", dstImage);  
        waitKey(0);  
        return 0;  
    }  
    //使用指针的方式访问
    //void colorReduce(Mat& inputImage, Mat& outputImage, int div){
    //  outputImage = inputImage.clone();
    //  int rows = outputImage.rows;
    //  int cols = outputImage.cols;
    //  for (int i = 0; i < rows; ++i){
    //      uchar* dataout = outputImage.ptr<uchar>(i);
    //      for (int j = 0; j < cols; ++j){
    //          dataout[j] = dataout[j] / div*div + div / 2;
    //      }
    //  }
    //}
    //使用at方法访问
    //void colorReduce(Mat& inputImage, Mat& outputImage, int div){
    //  outputImage = inputImage.clone();
    //  int rows = outputImage.rows;
    //  int cols = outputImage.cols;
    //  for (int i = 0; i < rows; ++i){
    //      for (int j = 0; j < cols; ++j){
    //          outputImage.at<Vec3b>(i, j)[0] = outputImage.at<Vec3b>(i, j)[0] / div*div + div / 2;
    //          outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div*div + div / 2;
    //          outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div*div + div / 2;
    //      }
    //  }
    //}
    //使用迭代器的方式访问
    void colorReduce(Mat& inputImage, Mat& outputImage, int div)
    //{
    //  outputImage = inputImage.clone();
    //  //模板必须指明数据类型    
    //  Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();
    //  Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>();
    //  //也可以通过指明cimage类型的方法不写begin和end的类型    
    //  /*Mat_<Vec3b> cimage = outputImage;
    //  Mat_<Vec3b>::iterator itout =outputImage.begin<Vec3b>();
    //  Mat_<Vec3b>::iterator itoutend = cimage.end();*/
    //  for (; it != itend; it++/*, it++*/)
    //  {
    //      (*it)[0] = (*it)[0] / div*div + div / 2;
    //      (*it)[1] = (*it)[1] / div*div + div / 2;
    //      (*it)[2] = (*it)[2] / div*div + div / 2;
    //  }
    //}

    参考博客:
    http://www.cnblogs.com/Xiaoyan-Li/p/5792796.html
    http://blog.csdn.net/qq_29540745/article/details/52443697

    展开全文
  • OpenCv访问图像像素

    2013-04-23 20:42:00
    假设你要访问第K通道,第i行,第j列的像素 一 间接访问:(通用,但效率低,可访问任意格式的图像) 对于单通道字节型图像: 1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 2 CvScalar ...

    假设你要访问第K通道,第i行,第j列的像素

    一 间接访问:(通用,但效率低,可访问任意格式的图像)

    对于单通道字节型图像:

    1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 
    2 CvScalar s;
    3  s=cvGet2D(img,i,j); // get the (j,i) pixel value, 注意cvGet2D与cvSet2D中坐标参数的顺序与其它opencv函数坐标参数顺序恰好相反.本函数中i代表y轴,即height;j代表x轴,即weight.也即先cvGet2D的第二个参数i表示行号,第三个参数j表示列号。而元素的坐标值的(j,i) printf("intensity=%f\n",s.val[0]);
    4  s.val[0]=111; 
    5 cvSet2D(img,i,j,s); // set the (j,i) pixel value

    对于多通道字节型/浮点型图像:

    1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 
    2 CvScalar s; 
    3 s=cvGet2D(img,i,j); // get the (j,i) pixel value 
    4 printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); 
    5 s.val[0]=111; 
    6 s.val[1]=111; 
    7 s.val[2]=111; 
    8 cvSet2D(img,i,j,s); // set the (j,i) pixel value 

     

    二 直接访问:(效率高,但容易出错)

    对于单通道字节型图像:

    1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 
    2 ((uchar *)(img->imageData + i*img->widthStep))[j]=111; 

    对于多通道字节型图像:

    1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); 
    2 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B 
    3 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G 
    4 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

    对于多通道浮点型图像:

    1 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 
    2 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B 
    3 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G 
    4 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

     

    三 基于指针的直接访问:(简单高效)

    对于单通道字节型图像:

    1 IplImage* img  = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 
    2 int height      = img->height; 
    3 int width       = img->width; 
    4 int step        = img->widthStep; 
    5 uchar* data    = (uchar *)img->imageData; data[i*step+j] = 111;

    对于多通道字节型图像:

    1 IplImage* img  = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); 
    2 int height      = img->height; 
    3 int width       = img->width; 
    4 int step        = img->widthStep; 
    5 int channels   = img->nChannels; 
    6 uchar* data    = (uchar *)img->imageData; 
    7 data[i*step+j*channels+k] = 111;

    对于多通道浮点型点型图像(假设图像数据采用4字节(32位)行对齐方式):

    1 IplImage* img  = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 
    2 int height     = img->height; 
    3 int width      = img->width; 
    4 int step       = img->widthStep; 
    5 int channels = img->nChannels; 
    6 float * data    = (float *)img->imageData; 
    7 data[i*step+j*channels+k] = 111;

     

    转载于:https://www.cnblogs.com/uriboyka/archive/2013/04/23/3038788.html

    展开全文
  • Opencv访问图像像素源码 实例图像 C++代码
  • 1.本文中测试的几种OpenCV访问图像像素的方法 2.测试结果 3.测试代码 4.代码输出结果 1.本文中测试的几种OpenCV访问图像像素的方法 方法1(使用at<>()访问图像像素) 方法2(使用ptr<>(row, col)...
  • opencv OpenCV访问图像像素, 数组元素等方法收集 分类: OPENCV2012-10-08 21:13 104人阅读 评论(0) 收藏 举报 imagefloatbyteaccesswrapperalignment [cpp] view plaincopy ...
  • opencv2.4.3中访问图像像素,有at函数法,指针法,迭代器法,帮助初学者入门,供大家参考。
  • 如何使用 opencv 访问图像像素 1 ) 假设你要访问第 k 通道、第 i 行、第 j 列的像素。 2 ) 间接访问: ( 通用,但效率低,可访问任意格式的图像) 对于单通道字节型图像: IplImage* img=cvCreateImage(cvSize(640,...
  • OpenCV访问图像像素, 数组元素等方法收集访问图像像素的一些方法。 * Indirect access: (General, but inefficient, access to any type image) o For a single-channel byte image: IplImage* ...
  • OpenCV访问图像像素的方法

    千次阅读 2014-07-09 20:29:37
    因为OpenCV的版本一直在更新,2.2之前的版本(老方法)和2.2之后版本(新方法)访问图像像素的方法有所不同;老的方法可以再新的版本下用,下面分别把两种访问方式的各种方法总结如下:   老方法 方法一:用...
  • 图像在内存中的存储方式 注:opencv 的通道顺序是BGR...访问图像像素方法 1)动态地址计算访问Mat img=imread("1.jpg"); Mat dst=img.clone(); imshow("src",img); int rowNumber=img.rows;//行数 int colNumber=img
  • OpenCV 访问图像像素

    2013-09-24 10:11:04
    最快的访问3通道图像像素点的方法。直接地址访问。 for(int y = 0; y height; y++) { uchar *ptr=(uchar *)(pImg3->imageData+y*pImg3->widthStep); for(int x = 0; x width; x++) { //green G ...
  • 访问图像像素有三种可行的方法方法一:指针访问指针访问访问的速度最快,Mat类可以通过ptr函数得到图像任意一行的首地址,同时,Mat类的一些属性也可以用到公有属性 rows和cols 表示行和列通道数可以通过channels...
  • Opencv访问图像像素的三种方法

    千次阅读 2016-09-05 21:09:30
    给图像的像素赋值,以此来访问图像像素。 #include #include using namespace std; using namespace cv; int main() { Mat image = imread("D:\\vvoo\\lena.jpg"); imshow("image", image); //三通道 uchar ...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 访问图像像素的一些方法。 * Indirect access: (General, but inefficient, access to any type image) o For a single-channel byte image: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 844
精华内容 337
关键字:

opencv访问图像像素