1.访问像素
(1)颜色空间缩减
data[j]=data[j]/div*div+div/2;
通过像素值转化,如把11-19均转化为10,从而缩减颜色空间
2.ROI区域叠加&图像混合
(1)定义ROI的方法
1.通过Rect指定
imageROI=image(Rect(x,y,logo.cols.logo.rows));
2.通过Range指定
imageROI=image(Range(),Range());
(2)mask和copyto函数
copyto的两种重载
1.image.copyTo(imageROI),作用是把image的内容粘贴到imageROI;
2.image.copyTo(imageROI,mask),mask作为一个掩模板,如果在某个像素点(i, j)其值为1(只看第一通道,所以mask单通道即可)则把image.at(i, j)处的值直接赋给imageROI.at(i, j),如果其值为0则imageROI.at(i, j)处保留其原始像素值
3.图像对比度、亮度值调整
(1)算子
算子的作用是接受一个或多个输入图像,并产生图像
g(x)=a*f(i,j)+b
代码示例
d.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_c*0.01)*(s.at<Vec3b>(y, x)[c]) + g_b);
saturate_cast的作用对数据结果强行转换,以确保它为有效值
(2)多个creatTrackbar的创建
注意:使用多个slider值但是使用同一个on_trackbar(回调函数!!)
同时注意回调函数两个参数必须为(int ,void*)
4.傅里叶变换
(1)Fourier简介
傅里叶的粗暴介绍:将一个函数变成多个正弦和余弦函数的组合!!
在频域里,对于一幅图像,
高频部分代表图像的细节和纹理,
低频部分代表图像的轮廓信息,
故而傅里叶变换在图像处理中可以做到图像增强,去噪、图片分割之边缘检测等功能
(2)重要函数详解
1.dft()
作用是对一维或二维浮点数数组进行正向或反向离散傅里叶变换。
2.getOptimalDFTSize()
返回给定向量尺寸的傅里叶最优尺寸大小
3.copyMakeBorder()
扩充图像边界
4.
Mat planes[] = { Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F) };
Mat complexI;
merge(planes, 2, complexI);
为傅里叶变换的结果分配存储空间
5.进行傅里叶变换
dft(complexI, complexI);
6.将复数转换为幅值
split(complexI, planes);
magnitude(planes[0], planes[1], planes[0]);
Mat magnitudeImage=planes[0];
7.进行对数尺度缩放
log(magnitudeImage, magnitudeImage);
8.剪切和重分布幅度图象限
int cx = magnitudeImage.cols / 2;
int cy = magnitudeImage.rows / 2;
Mat q0(magnitudeImage, Rect(0, 0, cx, cy));
Mat q1(magnitudeImage, Rect(cx, 0, cx, cy));
Mat q2(magnitudeImage, Rect(0, cy, cx, cy));
Mat q3(magnitudeImage, Rect(cx, cy, cx, cy));
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
9.归一化
normalize(magnitudeImage, magnitudeImage, 0, 1,NORM_MINMAX);