矩阵的掩膜操作
(一)
获取图像像素指针
Mat.ptr(int i = 0) 获取像素矩阵的指针
Const uchar* current = myImage.ptr(row); 获取当前行指针
(二)
像素范围处理
saturate_cast(数字)
确保RGB值在0~255之间
(三)
(四)
函数调用filter2D功能
定义掩膜 : Mat kernel = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0)
filter2D (src,dst,src.depth(),kernel);
Src :原图像
Dst :变化后图像
Src.depth() : 位图深度 有32,24,8等 。 可用-1代替表示和原图一样
(五)
测程序运行时间
double t = getTickCount();
– -----程序--------
double time = (getTickCount() - t) / getTickFrequency();
printf(“Time is %.6f”, time);
(代码部分)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
src = imread("D:/picture/Curry.jpeg");
if (!src.data) //如果没有找到图片
{
printf("could not find picture.....\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
/*
int cols = (src.cols - 1) * src.channels();
int offsets = src.channels();
int rows = src.rows;
dst = Mat::zeros(src.size(), src.type()); // 初始化dst 和src类型大小一样
for (int row = 1; row < (rows - 1); row++)
{
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* current = src.ptr<uchar>(row);
const uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dst.ptr<uchar>(row);
for (int col = offsets; col < cols; col++)
{
output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsets] + current[col + offsets] + previous[col] + next[col]));
}
}
*/
double t = getTickCount();
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0,
-1, 5, -1,
0, -1, 0);
filter2D(src, dst, src.depth(), kernel);
double time = (getTickCount() - t) / getTickFrequency();
printf("Time is %.6f", time);
namedWindow("output Image", CV_WINDOW_AUTOSIZE);
imshow("output Image", dst);
waitKey(0); //等待
return 0;
}
没有注释部分为直接用opencv封装库进行掩膜
实验效果