图像处理
- 一般来说,图像处理算子是带有一幅或多幅输入图像、产生一幅输出图像的函数。
- 图像变换可分为以下两种:
- 点算子(像素变换)
- 邻域(基于区域的)算子
像素变换
- 在这一类图像处理变换中,仅仅根据输入像素值(有时可加上某些全局信息或参数)计算相应的输出像素值。
- 这类算子包括 亮度和对比度调整 ,以及颜色校正和变换。
亮度和对比度调整
- 两种常用的点过程(即点算子),是用常数对点进行 乘法 和 加法 运算:
- 两个参数
和
一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制 对比度 和 亮度 。
- 你可以把f(x)看成源图像像素,把g(x)看成输出图像像素。这样一来,上面的式子就能写得更清楚些:
其中,i和j表示像素位于 第i行 和 第j列 。
示例代码
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src,dst;
double alpha =2;
double beta = 50;
src = imread("fruits.jpg");
if(!src.data)
{
cout<<"Failed to load image!"<<endl;
return -1;
}
namedWindow("Orignal Image");
imshow("Orignal Image",src);
dst = Mat::zeros(src.size(),src.type());
for (int i = 0;i<src.rows;++i)
for(int j= 0;j<src.cols;++j)
for(int k = 0;k<3;++k)
dst.at<Vec3b>(i,j)[k] = saturate_cast<uchar>(src.at<Vec3b>(i,j)[k]*alpha+beta);
namedWindow("Handled Image");
imshow("Handled Image",dst);
waitKey();
return 0;
}
Mat::zeros初始化零矩阵
C++: staticMatExpr Mat::zeros(int rows, intcols, inttype)
C++: staticMatExpr Mat::zeros(Size size, inttype)
C++: staticMatExpr Mat::zeros(int ndims, const int*sz, inttype)
Parameters: |
|
该方法返回一个 Matlab 式的零数组初始值设定项。它可以用于快速形成一个常数数组作为函数参数,作为矩阵的表达式或矩阵初始值设定项的一部分。
e.g
Mat A;
A = Mat::zeros(3, 3, CV_32F);
上面的示例中,只要A不是3X3的浮点型矩阵,就会重新分配内存;否则现有矩阵填充为0。
类型转换模板saturate_cast
C++: template<...> _Tp saturate_cast(_Tp2 v)
V --- 输入参数
功能:用于把输入类型精确转换为另一个类型
该函数把C++中原有的cast函数进行组合,具有溢出保护功能,大概类似于以下代码:
if(data<0)
data=0;
else if(data>255)
data=255;
e.g.
uchar a = saturate_cast<uchar>(-100);// a = 0 (UCHAR_MIN)
short b = saturate_cast<short>(33333.33333);// b = 32767 (SHRT_MAX)
当目标类型为unsigned char , signed char , unsigned short or signedshort时进行溢出保护,对32-bit integers没有保护
实验结果