本节直接用代码讲解一些图像的基本操作
像素级访问
第一种方法:模板函数at<>
uchar pixel=img.at(0,0); //获得灰度图像0,0点像素
Vec3b pixel=img.at(0,0); //获得3波段图像的第一个波段(0,0)像素。
第二种方法:函数ptr
他返回图像特定行的指针。因此可以得到每一行的数据,时间复杂度降低,
如下代码获取一副彩色图像的每个像素值。
uchar R,G,B;//降低时间复杂度
for (int i=0;i<img.rows;i++) //遍历行
Vec3b pixRow=img.ptr<Vec3b>(i);
for (int j=0;j<img.cols;j++) { //遍历**列**
B=pixRow[j][0];
G=pixRow[j][1];
R=pixRow[j][2];
}
Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
Vec3f对应三通道的float类型数据
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include<opencv2/face.hpp>
#include<iostream>
#include<math.h>
#include <string>
#include<fstream>
using namespace cv::face;
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
int main()
{
Mat src = imread("C:/Users/Administrator/Desktop/pic/5.jpg") ;
imshow("input", src);
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("output1", gray);
Mat gray_cha;
bitwise_not(gray, gray_cha);//颜色值取反,同下面算法一致,这个是通过位操作 与或非 实现的
imshow("output2", gray_cha);
int height = gray.rows;
int width = gray.cols;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
int pixel = gray.at<uchar>(row, col);//读取图像中 row,col 位置的像素(颜色数据由单通道组成),所以 <> 中用uchar,只返回的是一个uchar值
gray.at<uchar>(row, col) = 255 - pixel;//颜色值取反,灰度图的单通道也是一个字节大小,所以值在0-255之间
}
}
imshow("output3", gray);
Mat dst_cha;
bitwise_not(src, dst_cha);//颜色值取反,同下面算法一致
imshow("output4", dst_cha);
Mat dst;
dst.create(src.size(), src.type());
height = src.rows;
width = src.cols;
int nc = src.channels();
Mat convert;
src.convertTo(convert, CV_32F);//把CV_8UC1(uchar)转换到CV32F1(float), Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。Vec3f对应三通道的float类型数据
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
int b = src.at<Vec3b>(row, col)[0];//读取图像中 row,col 位置的像素(颜色数据由三通道组成),src是三通道的RGB,所以 <> 传的是Vec3b,返回的是长度3的uchar数组
int g = src.at<Vec3b>(row, col)[1];
int r = src.at<Vec3b>(row, col)[2];
float f_b = convert.at<Vec3f>(row, col)[0];//Vec3f
float f_g = convert.at<Vec3f>(row, col)[1];
float f_r = convert.at<Vec3f>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = 255 - b;//颜色值取反,若分别将 b g r 通道颜色设为0,图片整体颜色为 偏黄、偏绯红、偏青 色
dst.at<Vec3b>(row, col)[1] = 255 - g;
dst.at<Vec3b>(row, col)[2] = 255 - r;
gray.at<uchar>(row, col) = min(b, min(g, r));//随意设置的灰度图,取max图像会比取min亮
}
}
imshow("output5", dst);
imshow("output6", gray);
waitKey(0);
}
结果: