笔记参考自点击这里
1. 获取图像像素指针
- CV_Assert(myImage.depth() == CV_8U);
- Mat.ptr(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
- 获得当前行指针const uchar* current= myImage.ptr(row );
- 获取当前像素点P(row, col)的像素值 p(row, col) =current[col]
2. 像素范围处理saturate_cast
这个函数的功能是确保RGB值得范围在0~255之间,如下所示:
saturate_cast(-100),返回 0。
saturate_cast(288),返回255
saturate_cast(100),返回100
3. 掩膜操作实现图像对比度调整
-
矩阵的掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask 也被称为Kernel)
-
掩膜矩阵 3*3 在图像矩阵上移动与图像重合,与每一个重合的像素点做掩膜操作,
-
公式:中心点掩膜后的颜色数据 I(i,j)=5∗I(i,j)−[I(i−1,j)+I(i+1,j)+I(i,j−1)+I(i,j+1)]I(i,j)
-
这里是3*3的矩阵,所以图像数据的第一行倒数第一行,第一列倒数第一列不做掩膜操作 。其中: i,j 表示像素的位置,第 i 行,第 j 列, I(i,j) 表示每个通道颜色数据。
-
掩膜操作不是矩阵乘法,由公式可以看出
-
该掩膜矩阵的作用: 掩膜操作可以提高图像对比度,对比度提高可以增加图像感官度、锐化,让看起来有点模糊的图像更清晰
4. 函数调用filter2D功能
- 定义掩膜:Mat kernel = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);一个3*3的掩膜,后面是矩阵数值
- filter2D( src, dst, src.depth(), kernel ); 其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
system("color 5E");
Mat srcimage=imread("C:/Users/xihua/Pictures/Saved Pictures/opencv操作图/luosi.jpg");
if(!srcimage.data) {
cout<<"No image!"<<endl; return -1;
}
namedWindow("掩膜操作前");
imshow("掩膜操作前",srcimage);
Mat dstimage=Mat::zeros(srcimage.size(),srcimage.type());//得到一张与srcimage尺寸相同大小且类型相同的图像,矩阵数值均为0
int cols=(srcimage.cols-1)*srcimage.channels();//获取列数,不要忘了通道数
int channels=srcimage.channels();//通道数
cout<<"channels is:"<<channels<<endl;
int rows=srcimage.rows-1;//获取行数
for(int row=1;row<rows;row++) {
const uchar *previous=srcimage.ptr<uchar>(row-1);//获取图像前一行的指针
const uchar *current=srcimage.ptr<uchar>(row);//获取图像当前行指针
const uchar *next=srcimage.ptr<uchar>(row+1);//获取图像下一行指针
uchar *output=dstimage.ptr<uchar>(row);//获取输出图像的当前行指针
for(int col=channels;col<cols;col++) {
output[col]=saturate_cast<uchar>(5*current[col]-(previous[col]+next[col]+current[col-1]+current[col+1]));//套用掩膜公式
}
}
Mat filter2D_image=Mat::zeros(srcimage.size(),srcimage.type());
Mat mask=(Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);//调用API,定义一个3*3的掩膜mask,后为矩阵的数值
filter2D(srcimage,filter2D_image,srcimage.depth(),mask);//调用filter2D的API
namedWindow("掩膜操作");//创建一个窗口
imshow("掩膜操作",dstimage);//把图像显示到对应窗口上
namedWindow("filter2D");
imshow("filter2D",filter2D_image);
waitKey(0);
return 0;
}
图像效果