1、矩阵的掩膜操作
- 含义:根据掩膜来重新计算每个像素的像素值,掩膜(Mask也称kernel)
- 功能:可以通过掩膜来提高图像对比度
- 公式:
I(i,j)=5∗I(i,j)−[I(i−1,j)+I(i+1,j)+I(i,j−1)+I(i,j+1)]
- 红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象
2、获取图像像素指针
cv_Assert(myImage.depth() == CV_8U);
Mat.ptr < uchar >(int i = 0)
获取像素矩阵的指针,索引i表示第几行,从0开始计行数
- 获取当前行指针
const uchar* current = myImage.prt< uchar >(row);
- 获取当前像素点P(row, col)的像素值
P(row, col) = current[col];
3、像素处理范围saturate_cast< uchar >
saturate_cast< uchar >(-100)
,返回0
saturate_cast< uchar >(288)
,返回255
saturate_cast< uchar >(100)
,返回100
- 这个函数的功能是确保RGB值的范围在0~255之间
4、函数调用filter2D功能
- 定义掩膜:
Mat kernel = (Mat_< char>(3, 3) << 0,-1,0,-1,5,-1,0,-1,0);
filter2D(sec, dst, src,depth(), kernel);
- 其中src与dst是Mat类型变量,src.depth表示位图深度,有32、24、8等
5、代码
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("D:/C++Project/OpenCVProject/test.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
int cols = (src.cols - 1) * src.channels();
int offsetx = src.channels();
int rows = src.rows;
dst = Mat::zeros(src.size(), src.type());
for (int row = 1; row < (rows - 1); row++) {
const uchar* current = src.ptr<uchar>(row);
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dst.ptr<uchar>(row);
for (int col = offsetx; col < cols; col++) {
output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));
}
}
namedWindow("contrast image demo", WINDOW_AUTOSIZE);
resizeWindow("contrast image demo", 500, 500);
imshow("contrast image demo", dst);
waitKey(0);
return 0;
}