【OpenCV+Cpp】day02图像的掩膜(mask)操作
文章目录
前言
图像的掩膜(mask)操作是指根据mask矩阵(kernel核)重新计算图像中每个像素的值。在本文中,我们分别针对传统的mask手工方法和函数调用Filter2D方法进行图像的mask处理。
一、传统的mask手工方法
1. 获取图像像素指针
图像像素指针一般由Mat.ptr<uchar>(int i=0)
获取,索引i表示第几行数据,从0开始计数。
想要获取当前行指针,可以通过如下语句实现:
代码如下(示例):
for (int row = 1; row < (rows - 1); row++) {
const uchar* current = src.ptr<uchar>(row);//当前行
}
获取当前像素点P(row, col)的像素值p(row, col)=current[col]
2. 像素范围处理
像素范围处理一般使用saturate_cast以确保RGB值的范围在0-255之间。
saturate_cast(-100),返回0;
saturate_cast(288),返回255;
saturate_cast(100),返回100。
3. 利用mask核调整图像对比度
mask也被称为kernel,通过mask操作实现提高图像对比度。
手工mask处理代码如下(示例):
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src;
// 读入图像
src = imread("./1.png");
//判断图像是否存在
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;//行数
Mat dst;
dst = Mat::zeros(src.size(), src.type());//初始化 dst
for (int row = 1; row < (rows - 1); row++) {
//1. 获取图像像素指针
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++) {
//获取输出的像素值(确定范围在0-255之间)
output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));
}
}
imshow("contrast image demo", dst);
waitKey(0);
return 0;
}
输出结果如下图所示。
二、filter2D函数实现mask操作
filter2D函数实现mask操作具体分为两步:
- 定义一个kernel矩阵
- 利用filter2D函数处理图像
filter2D函数实现mask操作代码如下(示例):
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src;
// 读入图像
src = imread("./1.png");
//判断图像是否存在
if (!src.data) {
printf("could not load image...\n");
return -1;
}
// 显示图像
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
Mat dst;
//掩膜操作
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
//src表示输入图像,dst表示输出图像,src.depth表示图像深度,kernel表示mask核
filter2D(src, dst, src.depth(),kernel);
imshow("contrast image demo", dst);
waitKey(0);
return 0;
}
输出结果与传统方式一致。
总结
以上就是关于mask对图像进行像素值调整的操作。