学习OPENCV3.1.0 -2- 矩阵的掩膜操作
1.获取图像像素指针
· CV_Assert(myImage.depth() == CV_8U);
该函数用于判断输入图像数据为无符号字符格式:
CV_Assert函数:当它的表达式为假(Flase)时,会抛出一个错误]:
· Mat.ptr(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
· 获得当前行指针
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);
· 获取当前像素点P(row, col)的像素值
p(row, col) =current[col]
2.像素范围处理saturate_cast
· saturate_cast(-100),返回 0。
· saturate_cast(288),返回255
· saturate_cast(100),返回100
· 这个函数的功能是确保RGB值得范围在0~255之间
3.API-filter2D
void filter2D(InputArray src,
OutputArray dst,
int ddepth,
InputArray kernel,
Point anchor=Point(-1,-1),
double delta=0,
int borderType=BORDER_DEFAULT )
· src - 输入图像 dst - 输出图像
· ddepth – 输出图像的深度,如果该值设为负数则输出图像和输入图像有相同的通道数。ddepth可以根据以下罗列的方式设定。
src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F, ddepth = -1/CV_64F
· kernel – 卷积核 (or rather a correlation kernel), 为一个单通道的浮点型矩阵; 对于多通道的彩色图像,如果要对每一通道计算卷积,请使用split()函数将图像分割为多个通道,然后各个通道分别进行卷积处理。
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernel);
//src.depth()如果用-1代替,就默认和输入图像一样。
4.掩膜操作(图像对比度调整)
· 红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得 到最终结果就是对比度提高之后的输出图像Mat对象
5.代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/vcprojects/images/test.png");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", CV_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());
//Mat::zeros函数功能:dst的大小,类型和原图像一致
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 = offsetx; col < cols; col++) {
output[col] = saturate_cast<uchar>(5 * current[col] - (current[col- offsetx] + current[col+ offsetx] + 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 timeconsume = (getTickCount() - t) / getTickFrequency();
/*
getTickCount():用于返回从操作系统启动到当前所经的计时周期数
getTickFrequency():用于返回CPU的频率。get Tick Frequency。这里的单位是秒,也就是一秒内重复的次数。
*/
printf("tim consume %.2f\n", timeconsume);
namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
imshow("contrast image demo", dst);
waitKey(0);
return 0;
}