1.相关API理解
读一个GRAY像素点的像素值:int intensity = img.at<uchar>(y, x); 或者 int intensity = img.at<uchar>(Point(x, y));
其中y,x分别针对图像的row与col。
Vec3b与Vec3F解释:Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。Vec3f对应三通道的float类型数据。
把CV_8UC1转换到CV32F1实现是:src.convertTo(dst, CV_32F);
读一个RGB像素点的像素值:
Vec3f intensity = img.at<Vec3f>(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
反差处理API:bitwise_not(src, dst);第一个参数为输入图像,第二个为输出图像
2.代码实现
灰度图像像素读取修改:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("D:/demo.jpg");
Mat graySrc;
if (src.empty()) {
cout << "文件打开失败" << endl;
return -1;
}
imshow("显示图像", src);
//单通道像素读取
cvtColor(src, graySrc, CV_BGR2GRAY);//将src的灰度图像赋给graySrc
imshow("灰度图像", graySrc);
int height = graySrc.rows;
int width = graySrc.cols;
for(int row=0;row<height;row++)
{
for (int col = 0; col < width; col++)
{
int gray = graySrc.at<uchar>(row, col);//获取像素值
graySrc.at<uchar>(row, col)=255-gray;//改变像素值,反差处理
}
}
imshow("改变后图像",graySrc);
waitKey(0);
return 0;
}
RGB图像像素读取修改:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("D:/demo.jpg");
Mat graySrc;
if (src.empty()) {
cout << "文件打开失败" << endl;
return -1;
}
imshow("显示图像", src);
//使用Vec3f,将像素转化为三通道float值
Mat dest,srcF;
dest.create(src.size(), src.type());//也可写作dest.create(src.rows, src.cols,CV_8UC3);
int height = src.rows;
int width = src.cols;
src.convertTo(srcF, CV_32F);
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
Vec3f intensity = srcF.at<Vec3f>(row,col);
float blue = intensity.val[0];//B通道
float green = intensity.val[1];//G通道
float red = intensity.val[2];//R通道
dest.at<Vec3b>(row, col)[0] = 255 - blue;
dest.at<Vec3b>(row, col)[1] = 255 - green;
dest.at<Vec3b>(row, col)[2] = 255 - red;
}
}
imshow("个人实现输出图像", dest);
//直接使用封装的方法进行反差处理
Mat dest1;
dest1.create(src.size(), src.type());
bitwise_not(src, dest1);
imshow("API输出图像", dest1);
waitKey(0);
return 0;
}
结果如下:
效果是一致的。