访问图像的像素
本节内容通过一个实际的案例(颜色压缩)来说明访问图像像素的3种方法——颜色压缩的原理是data[j] = data[j]/div*div ,利用了char类型运算时的向下取整。
①通过指针访问像素
for(int i = 0;i < rowNumber;i++) //行循环
{
uchar* data = outputImage.ptr<uchar>(i); //获取outputImage第i行的首地址
for(int j = 0;j < colNumber;j++) //列循环
{
data[j] = data[j]/div*div + div/2;
}
}
②用迭代器操作像素
Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>(); //初始位置的迭代器
Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>(); //终止位置的迭代器
//存取彩色图像像素
for(;it != itend;++it)
{
// ------------------------【开始处理每个像素】--------------------
(*it)[0] = (*it)[0]/div*div + div/2;
(*it)[1] = (*it)[1]/div*div + div/2;
(*it)[2] = (*it)[2]/div*div + div/2;
// ------------------------【处理结束】----------------------------
}
③动态地址计算
int rowNumber = outputImage.rows; //行数
int colNumber = outputImage.cols; //列数
//存取彩色图像像素
for(int i = 0;i < rowNumber;i++)
{
for(int j = 0;j < colNumber;j++)
{
// ------------------------【开始处理每个像素】--------------------
outputImage.at<Vec3b>(i,j)[0] = outputImage.at<Vec3b>(i,j)[0]/div*div + div/2; //蓝色通道
outputImage.at<Vec3b>(i,j)[1] = outputImage.at<Vec3b>(i,j)[1]/div*div + div/2; //绿色通道
outputImage.at<Vec3b>(i,j)[2] = outputImage.at<Vec3b>(i,j)[2]/div*div + div/2; //红是通道
// -------------------------【处理结束】----------------------------
} // 行处理结束
}
图像的ROI设置
定义ROI有2种方法
①使用表示矩形区域的Rect
Mat imageROI;
imageROI = image( Rect(500, 250, logo.cols, logo.rows) ); // 左上角坐标、矩形的长和宽
②指定感兴趣行或列的范围Range
imageROI = image( Range(250, 250+logoImage,rows) , Range(200, 200+logoImage,cols) ); //
线性混合操作
利用 addWeighted() 函数
addWeighted(A, a, B, b, 0.0, C);
//其中A、B表示数组或者图像,a、b分别是它们混合所占权重,a+b=1, C为混合后的图像。
颜色通道的分离及混合
主要是 split 和 merge 两个函数的使用
分离图片的颜色通道
split( A, B) //其中A表示Mat类或者InputArray类型, B表示vector向量容器或者OutputArrays类型
举例:
vector<Mat> channels;
Mat imageBlueChannel;
Mat imageGreenChannel;
Mat imageRedChannel;
split( srcImage, channels);
imageBlueChannel = channels.at(0);
imageGreenChannel = channels.at(0);
imageRedChannel = channels.at(0);
merge(B, A); 其实就和split相反
merge( channels, srcImage);
调整图像对比度及亮度
本质公式: g(x)= a*f(x) + b
参数f(x) 表示源图像像素
参数g(x) 表示输出图像像素
参数a 称为增益,控制对比度
参数b 称为偏置,控制亮度
DFT傅里叶变换、XML及YAML文件
没咋看明白,日后再补充。