效果图
/*
1获取图像指针
2膜操作(卷积)
3效果--提高图片对比度,使其更加清晰
*/
#include<iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include<opencv2/objdetect.hpp>
using namespace std;
using namespace cv;
int main() {
//图像矩阵
Mat src, dst;
/*--------------------------------------------*/
//获取图像
src = imread("C:\\Users\\EDZ\\Desktop\\0.jpg");
//第一个图像窗口
namedWindow("");
//展示图像
imshow("原图",src);
/*---------------------------------------------*/
//掩膜操作
//获取宽
int cols = src.cols * src.channels();//宽度乘通道数才是真正的宽度
int rows = src.rows;
int offersetx = src.channels();
//因为我们不能修改原图(这会导致后面的卷积产生影响)
dst = Mat::zeros(src.size(), src.type());//生成0矩阵用于存结果
for (int row = 1; row < (rows - 1); row++) {
const uchar* current = src.ptr<uchar>(row);//获取第row行的指针
const uchar* priew = src.ptr<uchar>(row - 1);
const uchar* next = src.ptr<uchar>(row + 1);
//结果图
uchar* output = dst.ptr<uchar>(row);//中心点
for (int col = offersetx; col < cols; col++) {
output[col] = saturate_cast<uchar>(current[col]*5-priew[col]-next[col]-current[col-offersetx]-current[col+offersetx]);
//因为是多通道的图片,所以当前点往上以及往下只需要行数加减,而对于左右像素点,每个像素点是在一个大小的通道数的数组里的,所以进入左右点需要加减通道数
//前面的界定函数使像素值不超0~255
}
}
namedWindow("结果");
imshow("结果图",dst);
waitKey(0);
}