您的位置:首页 > 其它

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

2015-12-10 21:21 288 查看
在访问图像像素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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: