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;
}
相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
墨染天姬6 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志6 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114246 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠6 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好6 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力7 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo7 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
xiaozhazha_7 小时前
效率提升80%:2026年AI CRM与ERP深度集成的架构设计与实现
人工智能