数字图像处理和机器视觉中的常用特殊矩阵及MATLAB实现详解

一、前言

       Matlab的名称来源于“矩阵实验室(Matrix Laboratory)”,其对矩阵的操作具有先天性的优势(特别是相对于C语言的数组来说)。在数字图像处理和机器视觉实践中,为了提高编程效率,MATLAB 提供了多种方式来创建特殊的矩阵,如全零矩阵、全1矩阵、单位矩阵、空矩阵个、序列矩阵、稀疏矩阵、随机矩阵等。这些函数在图像模拟、统计分析、优化算法等多个领域都有广泛的应用。通过调整参数和结合MATLAB的其他功能,可以灵活地生成各种满足特定数字图像处理需求的随机矩阵。为了更好地快速掌握这里特殊矩阵的使用,每个矩阵后都附有实例,便于大家学习和交流。

二、特殊矩阵的生成及应用

1.全零矩阵

       元素全为零的矩阵称为全零矩阵,MATLAB可以使用zeros创建全零矩阵。如zeros(5),生成一个5×5的矩阵元素全为零的方阵,而zeros(3,4)则生成3×4的矩阵元素全为零的矩阵

       注意:如果使用zeros生成全零矩阵,其在MATLAB图像显示是黑色。

>> I=zeros(256,256);

>> imshow(I),title('全零矩阵图像')

2.全1矩阵

      元素全为1的矩阵称为全1矩阵,MATLAB可以使用ones创建全1矩阵。如ones(5),生成一个5×5的矩阵元素全为1的方阵,而ones(3,4)则生成3×4的矩阵元素全为1的矩阵。

注意:如果一个矩阵是全1矩阵,其在MATLAB图像显示是白色。

>> onesMatrix=ones(256,256);

>> figure,imshow(onesMatrix),title(‘全1矩阵’)

>> whos onesMatrix

       矩阵元素的数据类型为double,一个像素占8个Bytes。

3.单位矩阵

       如果一个方阵对角线上的元素全为1,而其他的元素全为零则称单位矩阵,MATLAB可以使用eys创建单位矩阵。

如eye(5),生成一个5×5的单位矩阵。

I=eye(5);

figure,imshow(I)

whos I

 

        矩阵元素的数据类型为double。

4. 空矩阵

空矩阵是指有一个或多个等于零的维度(0×0,0×1,1×0)

示例:

emptyMatrix=[]          %创建空矩阵

size(emptyMatrix)       %行列数都为0

length(emptyMatrix)     %矩阵长度为0

numel(emptyMatrix)      %元素个数为0

isempty(emptyMatrix)    %判断是否为空矩阵,返回逻辑值1(真)

5. 序列矩阵

在MATLAB中创建一个序列矩阵,可以使用冒号操作符 : 或者函数 linspace 和 meshgrid。以下是一些示例:

 5.1 创建一个1到20间隔为2的序列矩阵(从1开始):

1)使用冒号操作符 “:”创建

>> A = 1:2:20;

2) 使用linspace函数创建

>> A=linspace(1,19,10) %保存10个数据

5.2 生成一个二维网格采样点矩阵和生成三维曲面图

       Matlab的meshgrid函数是用于生成网格坐标的函数,它可以将二维或三维数组作为输入,生成对应的网格坐标矩阵。这个函数在绘制三维图形、进行数值分析等方面有着广泛的应用。

语法格式: meshgrid(x, y)或meshgrid(X,Y,Z)

其中,x和y可以是任何一维或二维数组,分别表示x轴和y轴的坐标;X和Y可以是任何一维或二维数组,表示x轴和y轴坐标的范围;Z是可选的,如果提供,则生成三维图形的网格坐标矩阵。

示例1-生成二维网格采样点矩阵并绘制其矩阵点图

%使用meshgrid生成二维矩阵点并绘制二维坐标点图
clear all;
close all;
clc;
x=1:3;y=2:5;
 [X,Y]=meshgrid(x,y)
 plot(X,Y,'+','LineWidth',2,'Color','r'),title('显示meshgrid生成的二维网格点');
 xlim([-2,5]);
 ylim([-2,6]);
 grid on

上面程序运行结果如下所示:

    由上可知X和Y都是3行4列的矩阵,X矩阵的每一列值相同,分别是1、2和3,Y矩阵的每一行值都相同,分别是2、3、4和5,这是因为MATLAB的坐标原点是左上角,X正方向水平向右,Y正方向垂直向下。

示例2-生成三维曲面图:

[X,Y] = meshgrid(-2:.2:2, -4:.4:4);

Z = X .* exp(-X.^2 - Y.^2);

surf(X,Y,Z)%创建三维曲面图

6. 稀疏矩阵

       稀疏矩阵—在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。MATLAB提供了sparse函数来创建稀疏矩阵。在MATLAB中,创建一个稀疏矩阵可以通过sparse函数实现,该函数接受行索引、列索引和非零值作为输入,并生成一个稀疏矩阵。

以下是创建稀疏矩阵的示例代码:

% 定义行索引、列索引和对应的值  

rows = [1; 3; 4; 5;6];  

cols = [1; 2; 3; 4; 8];  

values = [10; 20; 30; 35;40];  

% 使用sparse函数创建稀疏矩阵  

S = sparse(rows, cols, values);  

% 显示稀疏矩阵  

disp('显示稀疏矩阵的行列和非零值'),disp(S);  

% 如果你想要看到稀疏矩阵的完整形式(包括零),可以使用full函数  

disp('显示稀疏矩阵的完整形式'),disp(full(S));  

上面程序运行结果如下:

7.随机矩阵

       在MATLAB中,生成随机矩阵的常用函数是rand、randn、randi等。这些函数提供了不同的随机分布选项,以满足不同的应用需求,下面对上述各函数的含义和使用方法进行简要说明。

7.1 rand 函数

     rand函数生成均匀分布的随机数。其基本语法是rand(n)生成一个n×n的矩阵,rand(m,n)生成一个m×n的矩阵,而rand(size(A))生成与矩阵A相同大小的矩阵。

应用实例:生成一个5×5的均匀分布随机矩阵,并计算其均值和标准差。

MATLAB程序代码如下:

% 生成5x5的随机矩阵并计算其均值和标准差  

A = rand(5);  

% 计算均值  

%meanA = mean(A(:));  

meanA=mean2(A);  

% 计算标准差  

%stdA = std(A(:));  

stdA=std2(A);

disp('随机矩阵A:');  

disp(A);  

disp(['均值: ', num2str(meanA)]);  

disp(['标准差: ', num2str(stdA)]);

运行结果如下图所示:

7.2  randn

      randn(random normal distribution)是一种产生标准正态分布的随机数或矩阵的函数。randn函数生成标准正态分布的随机数(均值为0,标准差为1)。其语法与rand相同。

应用实例:生成一个10×10的标准正态分布随机矩阵,并计算其均值和标准差,并绘制其直方图以验证分布。

MATLAB程序代码如下:

% 生成10x10的标准正态分布随机矩阵  

B = randn(10,10);  %rand(10,10) 等价于rand(10)

meanB=mean2(B);   

stdB=std2(B);

% 绘制直方图  

figure;  

histogram(B(:), 'Normalization', 'pdf');  

title('标准正态分布随机矩阵的直方图');  

xlabel('值');  

ylabel('概率密度');

disp('随机矩阵B:');  

disp(B);  

disp(['均值: ', num2str(meanB)]);  %数据(n*n)不足够多,均值不绝对为0

disp(['标准差: ', num2str(stdB)]); %数据(n*n)不足够多,标准差不绝对为1

7.3  randi 函数

      在MATLAB命令提示符下,输入help  randi就会显示如下帮助:

randi- Pseudorandom integers from a uniform discrete distribution.因此randi函数生成指定范围内的均匀分布的伪随机整数。其基本语法是randi([imin, imax])生成介于imin和 imax之间的随机整数(包含imin和imax),或者randi(imax)生成1到imax之间的随机整数。

应用实例:生成一个10×12的矩阵,其元素为0到7(每个像素占用3bit)之间的随机整数,并计算矩阵各行的和,矩阵的最小值,最大值和平均值,显示其数字图像和randi分布随机矩阵的直方图。

MATLAB程序代码如下:

%%randi的应用

% 生成10x12的随机整数矩阵  

C = randi([0, 7], 10, 12);  

% 计算每行的和  

rowSums = sum(C, 2);  

meanC=mean2(C);  %计算其均值

minC=min(C(:));  %计算其最小值

maxC=max(C(:));  %计算其最大值

disp('随机整数矩阵C:');  

disp(C);  

disp('每行的和:');  

disp(rowSums);

figure,imshow(C,[]);

figure;  

histogram(C(:));  

title('randi分布随机矩阵的直方图');  

xlabel('灰度值');  

ylabel('频数');

程序的部分运行结果如下:

randi生成的矩阵C如下:

        矩阵C最大值maxC是7,最小值minC是0,平均值meanC是3.45(接近平均数(0+1+2+3+4+5+6+7)/8=3.5)。

矩阵C的图像显示如下图所示:

                   

       矩阵C的灰度直方图如下图所示:

             

       由直方图也可以看出,该分布其接近于均匀分布。大家可以使用上面程序生成100x120的随机整数矩阵并进行图像分析(矩阵的最大值、最小值和平均值和直方图等)。

      撰写博客不宜,如果大家觉得本文对大家学习有帮助,请点赞、收藏和评论,谢谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3270002.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

ResT v2 论文解读

paper:ResT V2: Simpler, Faster and Stronger official implementation:https://github.com/wofmanaf/ResT 出发点 ResTv2的设计目标是改进先前版本ResTv1的结构,以提高模型的效率和性能。ResTv1通过引入多尺度注意力机制(EMS…

深入源码:解析SpotBugs静态代码分析框架 0

文章目录 引言SpotBugs概述启动附录 引言 SpotBugs是一个开源的Java静态分析工具,旨在帮助开发人员检测Java代码中的潜在缺陷和漏洞。以下是对SpotBugs的详细解释: SpotBugs概述 定义与功能:SpotBugs是FindBugs的继任者。FindBugs是一个广受…

甲方产品过于平庸该如何编写策划案?

面对甲方产品相对平庸的情况,作为策展新人,你需要发挥创意和策略思维,通过巧妙的策划来挖掘和呈现产品的独特价值,让观众在展馆中依然能找到吸引他们的亮点。 以下是一些建议,希望能帮助你编写出既真实又能吸引眼球的…

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(2)登录,注册功能实现

技术支持:JAVA、JSP 服务器:TOMCAT 7.0.86 编程软件:IntelliJ IDEA 2021.1.3 x64 登陆页面如下 在这个页面中我们实现了一个登录页面和一个注册页面的Jsp文件,和两个java 的服务层文件 分别是web包下的denglu.jsp和zhuce.jsp以…

【Django】js实现简单计算器

文章目录 完整html写script写views写urls ##需求 ##实验 完整html {% load static %} <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

【JUC】Java锁介绍

文章目录 阿里锁开发规范乐观锁和悲观锁悲观锁乐观锁 synchronized 类锁、对象锁synchronized有三种应用方式锁相关的8种案例演示&#xff08;对象锁、类锁&#xff09;标准访问ab两个线程&#xff0c;请问先打印邮件还是短信&#xff1f;sendEmail钟加入暂停3秒钟&#xff0c;…

c++入门----类与对象(中)

OK呀&#xff0c;家人们承接上文&#xff0c;当大家看过鄙人的上一篇博客后&#xff0c;我相信大家对我们的c已经有一点印象了。那么我们现在趁热打铁再深入的学习c入门的一些知识。 类的默认成员函数 首先我们学习的是我们的默认函数。不知道大家刚读这个名词是什么反应。默认…

鱼哥好书分享活动第27期:看完这篇《云原生安全》了解云原生环境安全攻防实战技巧!

鱼哥好书分享活动第27期&#xff1a;看完这篇《云原生安全》了解云原生安全攻防实战技巧&#xff01; 主要内容&#xff1a;读者对象&#xff1a;本书目录&#xff1a;了解更多&#xff1a;赠书抽奖规则: 当前全球数字化的发展逐步进入深水区&#xff0c;云计算模式已经广泛应用…

【Linux C | 网络编程】简易进程池的实现详解(一)

进程池&#xff08;Process Pool&#xff09;是一种并发编程的模型&#xff0c;用于管理和复用多个进程&#xff0c;以提高系统的效率和性能。它主要解决的问题是减少因频繁创建和销毁进程而带来的性能开销&#xff0c;特别是在需要处理大量并发任务时尤为有效。 主要组成部分…

法律 | 法律人AI使用指南

原文&#xff1a;法律 | 法律人AI使用指南|法官|法院|文书|公司法_网易订阅 01 引言 过去半年多&#xff0c;我一直在尝试着用AI来辅助自己的各项法律工作&#xff0c;将AI融入自己的日常工作之中&#xff0c;并试图形成自身稳定的“法律AI”工作流。在此过程中&#xff0c;…

实时捕获数据库变更

1.CDC概述 CDC 的全称是 Change Data Capture &#xff0c;在广义的概念上&#xff0c;只要能捕获数据变更的技术&#xff0c;我们都可以称为 CDC 。我们目前通常描述的CDC 技术主要面向数据库的变更&#xff0c;是一种用于捕获数据库中数据变更的技术&#xff0c;CDC 技术应用…

【Plotly-驯化】一文教你学会画最美动态可视化的热力图:heatmap技巧

【Plotly-驯化】一文教你学会画最美动态可视化的热力图&#xff1a;heatmap技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取…

JS:JavaScript 简介

前言 在当今数字时代&#xff0c;JavaScript已然成为了现代Web开发的基石。从最初作为浏览器中的一个小型脚本语言&#xff0c;到如今成为驱动全球互联网的强大引擎&#xff0c;JavaScript的发展历程本身就是一个令人着迷的故事。 好了开始学习JS吧 1. 如果刚开始了解js&#…

智慧城管解决方案

1. 项目整体概述 智慧城管项目面临历史发展机遇&#xff0c;十九大提出以人为核心保障民生&#xff0c;推进新型城镇化。市民对政府服务有新诉求&#xff0c;同时云计算、物联网、移动互联网等技术迅速发展。 2. 传统城管业务模式问题 传统城管业务模式存在问题&#xff0c;…

leetcode106. 从中序与后序遍历序列构造二叉树,力扣105姊妹题

leetcode106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…

【每日刷题】Day86

【每日刷题】Day86 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 2. 数组中出现次数超过一半的数字_牛客题霸…

详解Mysql InnoDB引擎 04

文章目录 1. InnoDB 简介2. 逻辑存储结构2.1 表空间 idb文件2.2 段2.3 区 1M2.4 页 16KB2.5 行 3. 架构3.1 内存结构3.1.1 Buffer Pool 缓冲池3.1.2 Change Buffer 更改缓冲区3.1.3 Adaptive Hash Index3.1.4 Log Buffer 3.2 磁盘结构 4. 后台线程5. 事务原理5.1 redo log 重做…

C++的STL简介(一)

目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.string类 4.1为什么学习string类&#xff1f; 4.2string常见接口 4.2.1默认构造 ​编辑 4.2.2析构函数 Element access: 4.2.3 [] 4.2.4迭代器 ​编辑 auto 4.2.4.1 begin和end 4.2.4.2.regin和rend Capacity: 4.2.5…

LangChain曝关键漏洞,数百万AI应用面临攻击风险

LangChain是一个流行的开源生成式人工智能框架&#xff0c;其官网介绍&#xff0c;有超过一百万名开发者使用LangChain框架来开发大型语言模型&#xff08;LLM&#xff09;应用程序。LangChain的合作伙伴包括云计算、人工智能、数据库和其他技术开发领域的许多知名企业。 近日&…

前端模块化CommonJS、AMD、CMD、ES6

在前端开发中&#xff0c;模块化是一种重要的代码组织方式&#xff0c;它有助于将复杂的代码拆分成可管理的小块&#xff0c;提高代码的可维护性和可重用性。CommonJS、AMD&#xff08;异步模块定义&#xff09;和CMD&#xff08;通用模块定义&#xff09;是三种不同的模块规范…