基本图像处理:
图像分为单通道和多通道, 灰度图像每个 像素只需要一个字节表示, 是单通道图像, RGB图像每个像素需要3个字节表示, 是三通道图像.
单通道图像的矩阵表示:
三通道图像的矩阵表示:
对图像的处理是每一个像素中的每一个通道值 遍历每个通道值的两种方法:
(这里是对加强图像对比度的处理, 其中arpha 是加强对比度的处理, beta是提高图像亮度的处理)
int channels = src.channels(); //读取通道值
//每个像素的通道值可以归为列也可以归为行
int Rows = src.rows * channels;
int Cols = src.cols;
//如果图像是连续存储的, 就变为一行多列进行读取
if (src.isContinuous()) {
Cols *= Rows;
Rows = 1;
}
uchar *p, *q; //行指针
for (int i = 0; i < Rows; i++) {
p = src.ptr<uchar>(i);
q = res.ptr<uchar>(i);
for (int j = 0; j < Cols; j++) {
q[j] = saturate_cast<uchar>(alpha * p[j] + beta);
}
}
for (int i = 0; i < src.rows; i++) {
for (int j = 0; j < src.cols; j++) {
for (int c = 0; c < 3; c++)
res.at<Vec3b>(i, j)[c] = saturate_cast<uchar>(alpha * src.at<Vec3b>(i, j)[c] + beta); //Vec3b表示三通道图像, 对每个通道进行处理
}
}
两种处理方法的复杂度相同, 都是需要对每个像素的每个通道分别处理