opencv(2)掩膜操作
1、掩膜操作
掩膜操作是根据掩膜来重新计算每个像素的值
A[i,j]=5*B[i,j]-(B[i-1,j]+B[i+1,j]+B[i,j-1]+B[i,j+1]);
用上述处理的提高对比度
其他的掩膜可参看https://wenku.baidu.com/view/bc1407d6b14e852458fb57cd.html
2、获取图像的指针
const uchar* d = scr.ptr<uchar>(i); //获取scr内第i行的指针。
3、处理越界的像素
saturate_cast<uchar>(-1)=0; saturate_cast<uchar>(122)=122; saturate_cast<uchar>(300)=255;
4、直接调用函数
Mat key = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); //定义掩膜 filter2D(scr, ssr, -1, key); //对scr用key进行掩膜操作存到ssr //-1表示位图深度按源图像
5、代码
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; int main() { Mat scr,dst; scr = imread("D:/360.png"); if (!scr.data) { printf("找不到图片\n"); return -1; } namedWindow("源图像", WINDOW_AUTOSIZE); imshow("源图像", scr); //dst = scr; dst = Mat::zeros(scr.size(), scr.type()); int cols = (scr.cols - 1)*scr.channels(); int op = scr.channels(); int rows = scr.rows; for (int i = 1; i < rows - 1; i++) { const uchar* w = scr.ptr<uchar>(i - 1); const uchar* d = scr.ptr<uchar>(i); const uchar* s = scr.ptr<uchar>(i + 1); uchar* out = dst.ptr<uchar>(i); for (int j = op; j < cols; j++) { out[j] =saturate_cast<uchar>( 5 * d[j] - (w[j] + s[j] + d[j - op] + d[j + op])); } } namedWindow("处理后", WINDOW_AUTOSIZE); imshow("处理后", dst); Mat ssr, key = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); filter2D(scr, ssr, -1, key); namedWindow("处理后api", WINDOW_AUTOSIZE); imshow("处理后api", ssr); waitKey(0); return 0; }
6、运行结果
可以看到处理后的图片周围有黑线,因为周围并没有处理赋值。