【OpenCV+Cpp】day02图像的掩膜(mask)操作

【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操作具体分为两步:

  1. 定义一个kernel矩阵
  2. 利用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对图像进行像素值调整的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值