访问彩色像素的理解及疑惑

来源:互联网 发布:济南公交 大数据 编辑:程序博客网 时间:2024/05/22 06:44

在访问图像像素opencv提供了基本的三种方式:
一、指针
二、迭代
三、at()函数

下面就使用at()函数遇到的问题说一说,希望能帮到人,同时也希望有大神给透彻分析一下。

成功例子:

#include <iostream>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;int main(){    //Mat img = imread("Lena.jpg");直接采用imread()函数就会报内存读取错误,没找出来原因。    IplImage *image = cvLoadImage("E:\\···Lena.jpg");    Mat img(image,true); //转换成Mat类型    if (!img.data)    {        cout<<"Error";    }    for (int i=0;i<img.rows;i++)    {        for (int j=0;j<img.cols;j++)        {//彩色图像分为三个通道,每个像素值由三个分量组成            Vec3b pixe;            pixe[0] = i%255;            pixe[1] = j%55;            pixe[2] = 200;//分别设置三个分量的值,并把值存到容器中            img.at<Vec3b>(i,j) = pixe;//此处对每个像素赋值        }    }    imshow("img",img);    waitKey(0);    return 0;}

具体的针对单个像素的操作:

#include <iostream>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace std;using namespace cv;const int num = 300;void salt_pepper(Mat &img){    for (int i=0;i<num;i++)    {        int x = rand() % 255;        int y = rand() % 255;        if (img.channels() == 3)        {            img.at<Vec3b>(x,y)[0] = 255;            img.at<Vec3b>(x,y)[1] = 255;            img.at<Vec3b>(x,y)[2] = 255;        }    }}int main(){    Mat img = imread("Lena.jpg");    if (!img.data)    {        cout<<"error";    }    salt_pepper(img);    imshow("salt_pepper",img);    waitKey(0);    return 0;}

这里写图片描述

0 0