03- OpenCV:矩阵的掩膜操作

目录

[1、矩阵的掩膜操作 简介](#1、矩阵的掩膜操作 简介)

2、获取图像像素指针

3、掩膜操作解释

4、代码演示


1、矩阵的掩膜操作 简介

在OpenCV中,矩阵的掩膜操作是一种通过使用一个二进制掩膜来选择性地修改或提取图像或矩阵的特定区域的方法。

掩膜是一个与原始图像或矩阵具有相同大小的二进制图像或矩阵,其中像素值为0表示对应位置的像素或元素将被忽略,而像素值为1表示对应位置的像素或元素将被保留或处理。

掩膜操作常用于图像处理中的滤波、图像增强、边缘检测等任务。

2、获取图像像素指针

(1)CV_Assert(myImage.depth() == CV_8U);

(2)Mat.ptr<uchar>(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。

(3)获得当前行指针const uchar* current= myImage.ptr<uchar>(row );

(4)获取当前像素点P(row, col)的像素值 p(row, col) =current[col]

像素范围处理saturate_cast<uchar>

(1)saturate_cast<uchar>(-100),返回 0。

(2)saturate_cast<uchar>(288),返回255

(3)saturate_cast<uchar>(100),返回100

这个函数的功能是确保RGB值得范围在0~255之间

3、掩膜操作解释

(1)掩膜操作实现图像对比度调整(提高图像的对比度

红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象。

(2)矩阵的掩膜操作:

根据掩膜来重新计算每个像素的像素值,掩膜(mask也称为Kernel)

4、代码演示

(1)用简单掩膜算法:

cpp 复制代码
#include<opencv2\opencv.hpp>
#include<iostream>

int main(int argc, char** argv)
{
	Mat myImage = imread("test.jpg");
	CV_Assert(myImage.depth() == CV_8U);

	namedWindow("mask_demo", CV_WINDOW_AUTOSIZE);
	imshow("mask_demo", myImage);

	Mat resultImage;
	myImage.copyTo(resultImage);
	int nchannels = myImage.channels();
	int height = myImage.rows;
	int cols = myImage.cols;
	int width = myImage.cols * nchannels;
	for (int row = 1; row < height - 1; row++)
	{
		const uchar* previous = myImage.ptr<uchar>(row - 1);
		const uchar* current = myImage.ptr<uchar>(row);
		const uchar* next = myImage.ptr<uchar>(row + 1);
		uchar* output = resultImage.ptr<uchar>(row);
		for (int col = nchannels; col < nchannels * (myImage.cols - 1); col++)
		{
			*output = saturate_cast<uchar>(5 * current[col] - previous[col] - next[col] - current[col - nchannels] - current[col + nchannels]);
			output++;
		}
	}

	namedWindow("mask_result", CV_WINDOW_AUTOSIZE);
	imshow("mask_result", resultImage);

	waitKey(0);
	return 0;
}

(2)其实OpenCV已经把掩膜的相关算法封装起来,使用filter2D能实现一样的效果:

函数调用 filter2D 功能:

1、定义掩膜:Mat kernel = (Mat_<char>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

2、filter2D( src, dst, src.depth(), kernel );其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。

cpp 复制代码
#include<opencv2\opencv.hpp>
#include<iostream>

int main(int argc, char** argv)
{
	Mat src, dst;
	src = imread("test.jpg");
	if (!src.data)
	{
		printf("could not load image...\n");
	}

	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	double t = getTickCount();
	Mat kenel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(src, dst, src.depth(), kenel);
    
    // 处理的时间
	double timeconsume = (getTickCount() - t) / getTickFrequency();
	printf("time consume %.2f\n", timeconsume);

	namedWindow("mask_result", CV_WINDOW_AUTOSIZE);
	imshow("mask_result", dst);

	waitKey(0);
	return 0;
}
相关推荐
Mr.Winter`1 小时前
深度强化学习 | 图文详细推导软性演员-评论家SAC算法原理
人工智能·深度学习·神经网络·机器学习·数据挖掘·机器人·强化学习
强盛小灵通专卖员1 小时前
分类分割详细指标说明
人工智能·深度学习·算法·机器学习
特立独行的猫a3 小时前
HarmonyOS 【诗韵悠然】AI古诗词赏析APP开发实战从零到一系列(一、开篇,项目介绍)
人工智能·华为·harmonyos·古诗词
yu4106214 小时前
2025年中期大语言模型实力深度剖析
人工智能·语言模型·自然语言处理
feng995206 小时前
技术伦理双轨认证如何重构AI工程师能力评估体系——基于AAIA框架的技术解析与行业实证研究
人工智能·aaif·aaia·iaaai
2301_776681657 小时前
【用「概率思维」重新理解生活】
开发语言·人工智能·自然语言处理
蜡笔小新..7 小时前
从零开始:用PyTorch构建CIFAR-10图像分类模型达到接近1的准确率
人工智能·pytorch·机器学习·分类·cifar-10
富唯智能7 小时前
转运机器人可以绕障吗?
人工智能·智能机器人·转运机器人
视觉语言导航8 小时前
湖南大学3D场景问答最新综述!3D-SQA:3D场景问答助力具身智能场景理解
人工智能·深度学习·具身智能
AidLux8 小时前
端侧智能重构智能监控新路径 | 2025 高通边缘智能创新应用大赛第三场公开课来袭!
大数据·人工智能