通信系统仿真

崔春雷

目录

  • 1 第一单元: MATLAB基础
    • 1.1 课程说明与资料
      • 1.1.1 作业参考答案
      • 1.1.2 移动22级作业答案
    • 1.2 MATLAB安装与运行环境
      • 1.2.1 MATLAB介绍
    • 1.3 基本数据类型:数值类型
    • 1.4 基本数据类型:字符类型
    • 1.5 数据类型转换与输出
    • 1.6 数组与矩阵基础
      • 1.6.1 矩阵运算进阶
    • 1.7 数组与矩阵常用函数
    • 1.8 matlab中的逻辑运算
    • 1.9 实验: MATLAB常用数学函数
      • 1.9.1 实验 作业答案
    • 1.10 元胞数组
    • 1.11 结构体数组
      • 1.11.1 结构体进阶
      • 1.11.2 元胞数组与结构体数组对比
      • 1.11.3 map 容器
    • 1.12 附录:MATLAB常用基础命令
    • 1.13 拓展内容:实时脚本
      • 1.13.1 实时脚本示例
    • 1.14 课程作业与答案
      • 1.14.1 《通信系统仿真》期末考试
  • 2 第二单元:Matlab 程序设计
    • 2.1 顺序结构程序
    • 2.2 分支结构—— if语句
    • 2.3 分支结构—— switch语句
    • 2.4 循环结构—— while语句
    • 2.5 循环结构—— for语句
    • 2.6 图像处理基础
    • 2.7 Matlab的函数
      • 2.7.1 函数内容的课外扩展
    • 2.8 本章实验:for循环的应用
      • 2.8.1 素数问题
        • 2.8.1.1 素数的螺旋线排列
      • 2.8.2 3X+1猜想
      • 2.8.3 7 行代码计算 π
    • 2.9 排序算法
      • 2.9.1 冒泡排序
      • 2.9.2 选择排序
      • 2.9.3 插入排序
      • 2.9.4 快速排序
      • 2.9.5 基数排序
      • 2.9.6 计数排序
      • 2.9.7 堆排序
    • 2.10 动态规划算法
      • 2.10.1 动态规划编程实例
      • 2.10.2 动态规划:01背包问题
      • 2.10.3 动态规划常见题目分析
      • 2.10.4 动态规划题目分析2
    • 2.11 常用算法简介
      • 2.11.1 剪枝算法
      • 2.11.2 二分查找
      • 2.11.3 递归算法
      • 2.11.4 回溯算法
        • 2.11.4.1 Leetcode回溯题目合集
        • 2.11.4.2 回溯算法总结
        • 2.11.4.3 回溯法解数独问题
        • 2.11.4.4 DFS与BFS
          • 2.11.4.4.1 DFS/BFS原理
          • 2.11.4.4.2 BFS的应用:Dijkstra算法
      • 2.11.5 n 皇后问题专题
      • 2.11.6 双指针算法
      • 2.11.7 数组模拟链表(约瑟夫环)
      • 2.11.8 Hash(哈希表)
      • 2.11.9 图论与路径规划
        • 2.11.9.1 迪杰斯特拉算法
        • 2.11.9.2 A*算法
          • 2.11.9.2.1 A*算法的MATLAB实现
        • 2.11.9.3 RRT路径规划算法
          • 2.11.9.3.1 RRT算法 MATLAB代码
          • 2.11.9.3.2 参考资料
      • 2.11.10 数据结构
        • 2.11.10.1 数据结构例题
      • 2.11.11 前缀和 差分 双指针
      • 2.11.12 位运算
      • 2.11.13 常用算法代码模板
    • 2.12 练习题库
    • 2.13 code
      • 2.13.1 简易计算器gui代码
      • 2.13.2 五子棋
      • 2.13.3 连连看小游戏
      • 2.13.4 递归算法与汉诺塔
      • 2.13.5 有理数的小数循环节
    • 2.14 MATLAB编程风格
      • 2.14.1 向量化编程专题
  • 3 第三单元:Matlab 图形图像处理
    • 3.1 二维图形绘图基础
    • 3.2 二维图形绘图进阶
    • 3.3 三维图形绘图
      • 3.3.1 MATLAB绘图小结
        • 3.3.1.1 用matlab绘制好看图像
    • 3.4 MATLAB高级绘图
    • 3.5 文件操作
    • 3.6 Matlab图像处理进阶
      • 3.6.1 补充:Matlab图像处理常用函数
      • 3.6.2 RGB/HSV/HSI颜色模型
      • 3.6.3 图片切换动画效果
      • 3.6.4 图像连通域标记
      • 3.6.5 图像旋转与插值
      • 3.6.6 图像的形态学
      • 3.6.7 空间滤波
        • 3.6.7.1 图像中常见的噪声类型与滤波方法
        • 3.6.7.2 matlab中的滤波函数
        • 3.6.7.3 BM3D 去噪算法
        • 3.6.7.4 双边滤波
      • 3.6.8 图像的频域处理
    • 3.7 本章总结
    • 3.8 实验 : matlab 绘图练习1
    • 3.9 实验: matlab 绘图练习2
    • 3.10 实验 :数学函数图像绘制
    • 3.11 实验:绘图综合练习
    • 3.12 实验:曲线拟合
    • 3.13 实验:牛顿法求解方程的根
    • 3.14 实验:信号的傅里叶变换
      • 3.14.1 傅里叶变换、小波变换、希尔伯特变换
      • 3.14.2 新建目录
    • 3.15 课外补充:图像处理基础1
    • 3.16 课外补充:图像处理基础2
    • 3.17 课外补充:图像处理基础3
    • 3.18 课外补充:PYTHON基础
  • 4 第五单元:MATLAB通信仿真
    • 4.1 现代通信系统的介绍
    • 4.2 模拟通信系统的仿真原理
    • 4.3 HDB3编解码的仿真实现
    • 4.4 SIMULINK和其模块简介
    • 4.5 数字通信系统的仿真原理
    • 4.6 模拟通信系统Simulink仿真
    • 4.7 数字通信系统Simulink仿真
    • 4.8 音频信号测处理与仿真
    • 4.9 图像数字水印技术
      • 4.9.1 三角函数到傅里叶变换再到语音识别与数字水印
    • 4.10 信息系统与算法
      • 4.10.1 递归算法
        • 4.10.1.1 递归与堆栈的关系
      • 4.10.2 哈希表
      • 4.10.3 双指针算法
        • 4.10.3.1 双指针算法实战
        • 4.10.3.2 双指针进阶:滑动窗口算法
      • 4.10.4 字符串匹配 KMP算法
        • 4.10.4.1 字符串匹配B-M算法
      • 4.10.5 快速傅里叶变换
      • 4.10.6 回溯算法
      • 4.10.7 动态规划
      • 4.10.8 分治算法
      • 4.10.9 Dijkstra算法
  • 5 第六单元: systemview通信仿真
    • 5.1 SystemView概述
    • 5.2 模拟通信系统 数字系统的仿真分析
    • 5.3 SystemView通信系统仿真进阶
    • 5.4 新建课程目录
  • 6 第四单元:MATLAB高级应用
    • 6.1 符号运算基础
      • 6.1.1 利用Matlab自动推导公式
    • 6.2 Matlab中的数值计算
      • 6.2.1 积分的计算
      • 6.2.2 龙格库塔:常微分方程的数值解法
      • 6.2.3 fmincon函数与非线性方程最小值
    • 6.3 统计、拟合、插值
      • 6.3.1 协方差与相关系数
    • 6.4 GUI设计初步
    • 6.5 matlab GUI界面编程
      • 6.5.1 gui实例
      • 6.5.2 gui编程中常用函数
      • 6.5.3 App Designer入门
    • 6.6 实验:GUI设计图像空间变换系统
    • 6.7 作业:利用GUI设计 计算器、信号发生器等
    • 6.8 MTALB数据导入方法
    • 6.9 课外补充:MATLAB的App会取代GUI吗?
    • 6.10 模拟退火算法matlab实现
    • 6.11 遗传算法的Matlab实现
      • 6.11.1 进化算法(Evolutionary Algorithm)及相关函数介绍
    • 6.12 粒子群算法 matlab实现
      • 6.12.1 粒子群算法及MATLAB实例仿真
    • 6.13 BP网络的应用
    • 6.14 matlab 结构体
    • 6.15 群智能算法合集
  • 7 拓展知识
    • 7.1 什么是算法的时间复杂度?
    • 7.2 Notepad++使用教程
    • 7.3 MATLAB常用函数总结
    • 7.4 MATLAB常用知识点总结
    • 7.5 MATLAB命令大全
    • 7.6 视频:MATLAB官方基础教程
    • 7.7 经典书籍:Matlab2012经典超强教程
    • 7.8 经典书籍:MATLAB揭秘(自学宝典)
    • 7.9 经典资料:MATLAB N个实用技巧
    • 7.10 Matlab编程小技巧
    • 7.11 寻优算法
      • 7.11.1 Dijkstra算法python实现
    • 7.12 PYTHON基础教程
      • 7.12.1 Python进阶
      • 7.12.2 Python小技巧
      • 7.12.3 Python总结
        • 7.12.3.1 Python循环语句总结
        • 7.12.3.2 24个顶级Python库
        • 7.12.3.3 魔法函数
      • 7.12.4 廖雪峰python
      • 7.12.5 正则表达式基础
      • 7.12.6 numpy
        • 7.12.6.1 101道Numpy习题
        • 7.12.6.2 Numpy简要语法教程
        • 7.12.6.3 Numpy实现全连接神经网络 (手写数字识别)
        • 7.12.6.4 图解NumPy
      • 7.12.7 matplotlib
        • 7.12.7.1 matplotlib练习50题
        • 7.12.7.2 Matplotlib速查表
        • 7.12.7.3 Matplotlib 实操指南
      • 7.12.8 Python3 模块 import
      • 7.12.9 Python 小项目
    • 7.13 参考资源:数据结构与算法
      • 7.13.1 十大经典排序算法总结
    • 7.14 机器学习概述
      • 7.14.1 反向传播算法
        • 7.14.1.1 反向传播的数学原理
      • 7.14.2 极大似然估计
        • 7.14.2.1 极大似然估计与最小二乘法
      • 7.14.3 Batch Normalization
        • 7.14.3.1 Batch Normalization&Dropout浅析
        • 7.14.3.2 ​BN层的梯度反向传播计算
        • 7.14.3.3 Batch Size的大小与神经网络的性能
        • 7.14.3.4 标准化和归一化
      • 7.14.4 主成分分析PCA与SVD奇异值分解
        • 7.14.4.1 岭回归 与 PCA
        • 7.14.4.2 PCA原理推导
        • 7.14.4.3 PCA原理新解
        • 7.14.4.4 svd
        • 7.14.4.5 PCA数学原理
      • 7.14.5 正则化
        • 7.14.5.1 L1、L2正则化和过拟合 总结
        • 7.14.5.2 L1 和 L2 正则化的直观解释
      • 7.14.6 SVM
        • 7.14.6.1 从零推导支持向量机(SVM)
        • 7.14.6.2 支持向量机(SVM)介绍
        • 7.14.6.3 SVM推导与实战
        • 7.14.6.4 支持向量机的直观理解
        • 7.14.6.5 浅显易懂的支持向量机SVM
      • 7.14.7 线性回归
      • 7.14.8 逻辑回归
      • 7.14.9 BP算法
        • 7.14.9.1 万能逼近——神经网络拟合任意函数原理
      • 7.14.10 激活与池化
        • 7.14.10.1 激活函数与损失函数 小结
      • 7.14.11 深度学习简述
        • 7.14.11.1 MATLAB2020深度学习实例
      • 7.14.12 损失函数与误差反向传播
        • 7.14.12.1 梯度下降与损失函数
      • 7.14.13 深度学习优化问题
      • 7.14.14 梯度下降法
        • 7.14.14.1 各类梯度下降算法的Python实现
        • 7.14.14.2 梯度下降的直观理解
        • 7.14.14.3 动量、RMSProp、Adam
      • 7.14.15 卷积的概念
        • 7.14.15.1 卷积的矩阵化算法
      • 7.14.16 局部连接
      • 7.14.17 RNN
      • 7.14.18 LSTM
      • 7.14.19 CNN-四大经典CNN技术浅析
      • 7.14.20 熵(Entropy)与交叉熵
      • 7.14.21 softmax函数详解
      • 7.14.22 自编码算法详细理解与代码实现
      • 7.14.23 pytorch
        • 7.14.23.1 ​PyTorch简介
          • 7.14.23.1.1 Pytorch快速入门资料
        • 7.14.23.2 CNN的PyTorch实现
        • 7.14.23.3 pytorch总结
        • 7.14.23.4 PyTorch trick 集锦
        • 7.14.23.5 在PyTorch上加载自定义数据集
        • 7.14.23.6 实战:Pytorch识别验证码
        • 7.14.23.7 实战:Transformer的最简洁pytorch实现
        • 7.14.23.8 使用PyTorch实现神经网络分类
      • 7.14.24 卷积神经网络CNN概述
        • 7.14.24.1 CNN 简易原理
        • 7.14.24.2 卷积神经网络CNN原理详解
        • 7.14.24.3 自己手写一个卷积神经网络
        • 7.14.24.4 CNN反向传播算法
        • 7.14.24.5 卷积计算、作用与思想
        • 7.14.24.6 用卷积神经网络CNN识别手写数字集
        • 7.14.24.7 卷积 池化 参数的计算
        • 7.14.24.8 im2col方法实现卷积算法
        • 7.14.24.9 卷积核的梯度计算
        • 7.14.24.10 卷积层反向传播推导及实现
        • 7.14.24.11 反向传输算法
          • 7.14.24.11.1 resnet残差网络
        • 7.14.24.12 CNN反向传播的MATLAB实现
      • 7.14.25 神经网络的调参技巧
      • 7.14.26 BP神经网络
        • 7.14.26.1 零开始搭建bp神经网络
        • 7.14.26.2 MATLAB自带的bp工具箱
        • 7.14.26.3 神经网络中偏置(bias)的作用
      • 7.14.27 聚类分析 k-means
        • 7.14.27.1 matlab做聚类分析(k-means)
        • 7.14.27.2 聚类模型探讨综述
        • 7.14.27.3 5种经典聚类算法
      • 7.14.28 深度学习的一些概念
      • 7.14.29 人工智能简述:AI的过去和现在
      • 7.14.30 k-NN(k近邻算法)
      • 7.14.31 神经网络中的优化器:BGD、SGD、MBGD、Momentum
      • 7.14.32 卷积神经网络的经典网络总结
        • 7.14.32.1 卷积神经网络中十大拍案叫绝的操作
      • 7.14.33 GAN 对抗样本攻击
      • 7.14.34 蒙特卡洛模拟
      • 7.14.35 dropout与随机部分连接
      • 7.14.36 Jupyter 等 IDE概览
      • 7.14.37 分类算法常用评价指标
      • 7.14.38 Inception 网络与不变性
      • 7.14.39 卷积神经网络的可视化
      • 7.14.40 隐马尔可夫模型HMM
        • 7.14.40.1 马尔科夫链
    • 7.15 MATLAB音频处理
      • 7.15.1 python处理音频信号
    • 7.16 图像处理
      • 7.16.1 图像处理中的指标
    • 7.17 代码集
    • 7.18 论文写作与阅读方法
      • 7.18.1 期刊投稿攻略
      • 7.18.2 论文排版教程
      • 7.18.3 SCI-HUB论文下载技巧
      • 7.18.4 几种论文写作神器,提高写作效率
      • 7.18.5 latex入门
      • 7.18.6 LaTeX教程
    • 7.19 机器学习常用的网站以及资源
      • 7.19.1 很详细的ML&DL学习博客
    • 7.20 SymPy 符号计算基本教程
  • 8 程序设计数学基础
    • 8.1 编程数学基础
      • 8.1.1 概率的历史
      • 8.1.2 概率
        • 8.1.2.1 常见概率分布
          • 8.1.2.1.1 二维正态分布
        • 8.1.2.2 蒙特卡罗方法
        • 8.1.2.3 置信区间
        • 8.1.2.4 协方差与相关系数
      • 8.1.3 矩阵 向量求导法则
      • 8.1.4 雅可比矩阵 海森矩阵
      • 8.1.5 矩阵的几种分解方式
      • 8.1.6 行列式和代数余子式
      • 8.1.7 向量
      • 8.1.8 矩阵的基本运算
      • 8.1.9 矩阵分析
      • 8.1.10 矩阵的LU分解
      • 8.1.11 矩阵奇异值分解(SVD)
        • 8.1.11.1 SVD分解2
        • 8.1.11.2 SVD分解逐步推导
        • 8.1.11.3 奇异值与特征值的意义
      • 8.1.12 随机向量
        • 8.1.12.1 随机过程简述
      • 8.1.13 投影矩阵和最小二乘
      • 8.1.14 知乎数学精选集
        • 8.1.14.1 高数问题集
      • 8.1.15 小波变换
      • 8.1.16 程序设计数学基础1:高等数学
      • 8.1.17 程序设计数学基础2:线性代数
      • 8.1.18 程序设计数学基础3:概率论和数理统计
      • 8.1.19 向量的距离与相似度计算
      • 8.1.20 复数
      • 8.1.21 高等数学——幂级数
      • 8.1.22 无穷小的本质
      • 8.1.23 数列极限和收敛性
      • 8.1.24 不定积分技巧总结
    • 8.2 有趣的数学题目
    • 8.3 高等数学
      • 8.3.1 泰勒级数
  • 9 路径规划与智能算法
    • 9.1 常见路径规划算法简介
    • 9.2 Dijkstra算法详细
  • 10 教学文档
    • 10.1 授课计划
    • 10.2 课程标准
图像处理基础


           计算机图形图像处理基础



练习图片
















1.计算机图片原理

黑白模式(单色图像、二值图像):像素只有黑白以及中间的过渡灰色。

        图片由黑色区域和白色区域组成。每个像素的值在0-255之间(uint8类型),或0-1之间(double类型

       如,0-1体系里,0(纯黑),1(纯白),0.4,0.78等为灰色。





按照0-255体系,则有:




RGB彩色模式:每个像素点都有三盏灯RGB,通过RGB三盏灯的亮度就可以组合出该像素点的颜色和亮度!

LED显示器的一个像素的结构。



颜色组合原理:



(1)每一个像素由RGB三个分量组成。

(2)一副彩色数字图像由R, G, B三个通道构成,可以看做一个三维数组。

(2)每个分量各占8位,其范围为0~255,每个像素24位比特(8*3bit,3字节)。






灰度图与rbg彩色图之间的关系;


%手工建立一个灰度十字型


P=[ 0 0 0 0 0 0 0 0 0 0 0 0;

       0 0 0 0 1 1 1 1 0 0 0 0;

       0 0 0 0 1 1 1 1 0 0 0 0;

       0 0 0 0 1 1 1 1 0 0 0 0;

       0 1 1 1 1 1 1 1 1 1 1 0; 

       0 1 1 1 1 1 1 1 1 1 1 0;

       0 1 1 1 1 1 1 1 1 1 1 0;

       0 1 1 1 1 1 1 1 1 1 1 0;

       0 0 0 0 1 1 1 1 0 0 0 0;

       0 0 0 0 1 1 1 1 0 0 0 0;

       0 0 0 0 1 1 1 1 0 0 0 0;

       0 0 0 0 0 0 0 0 0 0 0 0 ];

imshow(P)



%建立rbg图


P1=P*0.82;

P2=P*0.11;

P3=P*0.66;

P_rgb=cat(3,P1,P2,P3);


imshow(P_rgb)


任务:请把自己的学号的最后一位数字,用上述方式,分别制作成灰度图,以及rgb彩图,并显示。


练习:设计一个3*3*3的3维数组pic,通过imshow( )函数显示pic, 在屏幕上得到一个3行3列(一共9个像素点)的小图片,这个图片上的颜色分布为:

clc

r=[ 0  1  0.5

      1  0  0

      1  0  1 ]


g=[ 0  1  0.5

      0  1  0

      1  1  0 ]


b=[ 0  1  0.5

      0  0  1

      0  1  1 ]


pic=cat(3,r,g,b)

imshow(pic)




2imshow函数——显示图片

 imshow函数:

(1)作用: imshow函数可以把一个二维矩阵(灰度图)或者三维矩阵(彩图)以图片形式显示出来。

(2)处理的数据类型: imshow函数处理的矩阵的数据类型可以是uint8类型(数值范围0-255),和double类型(数值范围0-1)。

% imshow用法 

pic1=imread( ' D:\catgray.jpg ' ); %imread读取一个图片,并以矩阵方式存给变量pic

imshow(pic1);                   %把矩阵pic1(uint8类型)当成图片来显示

size(pic1)                          %显示矩阵pic的尺寸

                                           %显示矩阵pic的数据类型,默认为uint8类型

pic2=double(pic1)/255;     %思考一下为啥要除以255?

imshow(pic2);       %把矩阵pic2(double类型)当成图片来显示

whos pic1 pic2      %查看pic1、pic2的数据类型


imtool(pic1);      %把矩阵pic当成图片,并用imtool 工具来探索图片信息。




3导入图片imread( ) / 输出图片imwrite()


导入图片,imread( )函数用法:

 A = imread(filename.fmt)      根据文件名filename读取灰度获彩色图像。返回的数组A包含图像数据。若文件包含灰色图像,A是M*N的数组;若文件名包含真彩图像,A是M*N*3的数组。、

输出图片imwrite()函数用法:imwrite(pic,'filename'),

一种更常用但仅适用于JPEG图像的imwrite语法是:imwrite(f, 'filename.jpg', quality', q);其中,q是介于0到100的整数(缘于JPEG压缩,q越小,图像的退化就越严重)。仅适用于TIFF图像的更常用的imwrite语法如下:


% 示例:

clc; clear all;


pic1=imread('D:\pic\pic16.jpg');   %从'D:\pic\pic16.jpg'处读入图片给pic1


imshow(pic1)                     %显示pic1


[r,c,h] = size(pic1)              %测量pic1的行数r、列数c、厚度h


pic2=pic1(1:700,1:700,:);   %截取pic1的第1-700行,1-700列 ,赋给pic2


imshow(pic2)                     %显示pic2


pic3=fliplr(pic2);                %把pic2左右翻转后赋给pic3


imshow(pic3)                     %显示pic3


imwrite(pic3,'D:\pic\pic16_new.png')   %把 pic3保存为'D:\pic\pic16_new.png'




4. 彩色图/灰度图/二值图的转换


     (1)  把RGB彩色图像转为灰度图

                        %灰度图与彩色图的关系



 RGB颜色空间 基于颜色的加法混色原理,从黑色不断叠加Red,Green,Blue的颜色,最终可以得到白色光,如图:

                                                  

将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。


对于彩色转灰度,有一个很著名的心理学公式:Gray = R*0.299 + G*0.587 + B*0.114

clear all;       

pic_rgb=imread('E:\pic8.jpg');    %读入彩色图


[n,m,d]=size(pic_rgb)     %测量彩色图的size

pic_r =pic_rgb(:,:,1);        %抽取R通道的矩阵给变量pic_r 

pic_g=pic_rgb(:,:,2);        %抽取G通道的矩阵给变量pic_g 

pic_b=pic_rgb(:,:,3);        %抽取B通道的矩阵给变量pic_b 

pic_gray1=pic_r*0.299 +pic_g*0.587+pic_b*0.114;    %利用心理学公式合成

pic_gray2 =pic_r*0.333 +pic_g*0.333+pic_b*0.333;     %均值化合成


%显示以上各图

subplot(2,3,1),imshow(pic_rgb);    

subplot(2,3,2),imshow(pic_r);

subplot(2,3,3),imshow(pic_g);

subplot(2,3,4),imshow(pic_b);

subplot(2,3,5),imshow(pic_gray1);

subplot(2,3,6),imshow(pic_gray2);





(2)灰度图转二值图

%方法1:for循环

clf


pic_rgb=imread('D:\matlab2021\pic\huoche_rbg.jpg');  %读入彩色图

pic_r =pic_rgb(:,:,1);        %抽取R通道的矩阵给变量pic_r 

pic_g=pic_rgb(:,:,2);        %抽取G通道的矩阵给变量pic_g 

pic_b=pic_rgb(:,:,3);        %抽取B通道的矩阵给变量pic_b 


pic_gray1=pic_r*0.299 +pic_g*0.587+pic_b*0.114;    %利用心理学公式合成


pic_bw=pic_gray1;            %把pic_gray1复制一份给pic_bw,pic_bw为即将出现的二值图

[row,col]=size(pic_bw)      %测量图片的行数,列数

level=median(pic_bw(:));   %把图像所有像素中的中位数当做level值


for n=1:row                              %历遍所有行

     for m=1:col                         %历遍所有列  

         if  pic_bw(n,m)<=level    %如果当前像素小于level值则将其置为0

             pic_bw(n,m)=0;

         else                                 %如果当前像素大于level值则将其置为255

             pic_bw(n,m)=255;

         end

    end

end

subplot(1,2,1), imshow(pic_gray1)              

subplot(1,2,2), imshow(pic_bw)




%方法2:向量化

clf

pic_bw=pic_gray1;

level=median(pic_bw(:));

pic_bw(pic_bw<level)=0;

pic_bw(pic_bw>=level)=255;

imshow(pic_gray1)

imshow(pic_bw)



(3)把灰度图中偶数行与偶数列的点置0

%方法1:双重for循环


clf

pic_0=pic_gray1;

[row,col]=size(pic_0)

for n=1:row

    for m=1:col

        if mod(n,2)==0|mod(m,2)==0

           pic_0(n,m)=0;

        end

    end

end

imshow(pic_gray1)

imshow(pic_0)



%方法2:单层for循环

clf

pic_0=pic_gray1;

[row,col]=size(pic_0)


for n=2:2:row

           pic_0(n,:)=0;

end


for m=2:2:col

           pic_0(:,m)=0;

end


imshow(pic_gray1)

imshow(pic_0)






(4)对图像进行反相处理

反相,顾名思义,就是对图像做减法。

Image_new = 255 - Image_old;     %0-255模式

Image_new = 1 - Image_old;         %0-1模式


%对灰度图的反相处理

pic_fx=255-pic_gray1;

imshow(pic_gray1)

imshow(pic_fx)


%对彩色图的反相处理

pic_color_fx=255-pic_rgb;

imshow(pic_rgb)

imshow(pic_color_fx)



(5)图像的Gamma矫正

将灰度过高或者灰度过低的图片进行修正,增强对比度。



试着采用不同伽马值对灰度图进行调整。

clf

Gamma=2;       %设置伽马值

pic_Gamma=(double(pic_gray1)/255).^Gamma;  %需先把图片矩阵转为double型

imshow(pic_gray1)

imshow(pic_Gamma);





综合练习1:

图像中颜色的替换

要求,把下面左图中的深蓝色替换成如右图所示的油绿色。



        绿色RGB值: 


clear all       

clf

pic_rgb=imread('E:\pic7.jpg');  %读入彩色图

[n,m,d]=size(pic_rgb)     %测量彩色图的size


%查看所选的蓝色纯色部分的,各个通道的亮度值

region_r = pic_rgb(1:50,1:50,1)

region_g= pic_rgb(1:50,1:50,2)

region_b= pic_rgb(1:50,1:50,3)


%求出该块的红通道亮度的最小r1,最大值r2

r1=min(region_r(:)), r2=max(region_r(:))


%求出该块的绿通道亮度的最小g1,最大值g2

g1=min(region_g(:)), g2=max(region_g(:))


%求出该块的蓝通道亮度的最小b1,最大值b2

b1=min(region_b(:)), b2=max(region_b(:))


pic_r  = pic_rgb(:,:,1);        %抽取R通道的矩阵给变量pic_r 

pic_g = pic_rgb(:,:,2);        %抽取G通道的矩阵给变量pic_g 

pic_b = pic_rgb(:,:,3);        %抽取B通道的矩阵给变量pic_b 


for i=1:n

    for j=1:m

          r_logic =  ( pic_r(i,j)>=r1&pic_r(i,j)<=r2 );

          g_logic = ( pic_g(i,j)>=g1&pic_g(i,j)<=g2 );

          b_logic = ( pic_b(i,j)>=b1&pic_b(i,j)<=b2 );


          if   r_logic & g_logic & b_logic

                 %整个图片中,通道中但凡像素亮度在r1-r2之间的点,统统替换成37

                 %整个图片中,绿通道中但凡像素亮度在g1-g2之间的点,统统替换成61

                 %整个图片中,通道中但凡像素亮度在b1-b2之间的点,统统替换成36

                pic_r(i,j)=37;

                pic_g(i,j)=61;

                pic_b(i,j)=36;

           end

    end

end


pic_rgb2=cat(3,pic_r,pic_g,pic_b);  %把三个被处理后的通道重新合并成一个三维数组


subplot(1,2,1), imshow(pic_rgb)              

subplot(1,2,2), imshow(pic_rgb2)




%方法2:向量化编程

clear all       

clf


pic_rgb=imread('E:\pic7.jpg');     %读入彩色图

[n,m,d]=size(pic_rgb)                   %测量彩色图的size


%查看所选的蓝色纯色部分的,各个通道的亮度值

region_r = pic_rgb(1:50,1:50,1)

region_g= pic_rgb(1:50,1:50,2)

region_b= pic_rgb(1:50,1:50,3)


%求出该块的红通道亮度的最小值r1,最大值r2

r1=min(region_r(:)), r2=max(region_r(:))


%求出该块的绿通道亮度的最小值g1,最大值g2

g1=min(region_g(:)), g2=max(region_g(:))


%求出该块的蓝通道亮度的最小值b1,最大值b2

b1=min(region_b(:)), b2=max(region_b(:))


pic_r  = pic_rgb(:,:,1);        %抽取R通道的矩阵给变量pic_r 

pic_g = pic_rgb(:,:,2);        %抽取G通道的矩阵给变量pic_g

pic_b = pic_rgb(:,:,3);        %抽取B通道的矩阵给变量pic_b


r_logic = ( pic_r>=r1&pic_r<=r2 );

g_logic= ( pic_g>=g1&pic_g<=g2 );

b_logic= ( pic_b>=b1&pic_b<=b2 );


pic_logic = r_logic & g_logic & b_logic;


pic_r(pic_logic)  = 37;

pic_g(pic_logic) = 61;

pic_b(pic_logic) = 36;


pic_rgb2 = cat(3,pic_r,pic_g,pic_b);  %把三个被处理后的通道重新合并成一个三维数组


subplot(1,2,1), imshow(pic_rgb)              

subplot(1,2,2), imshow(pic_rgb2)







综合练习3:生成随机彩色网格图

     要求:生成如下的3*3的彩色网格图,每个网格100*100像素。

  

教学目标:通过本项目综合掌握随机函数、图形显示与绘图原理、矩阵的赋值等知识点。

(1)矩阵复制:repmat () 函数

B = repmat(A,m,n)
       B = repmat(A,[m n])
       B = repmat(A,[m n p...])

%repmat 复制矩阵应用案例

A=randi([0,9],2,2)

B=zeros(10,10);

B(1 : 4 , 1 : 6)=repmat(A , 2 , 3);

B


%如果矩阵的一大片需要赋相同的值,则可以直接把某个值赋给矩阵的这个切片。

A=randi([0,9],2,2)

B=zeros(10,10) ;

B(1 : 4 ,1 : 6)=repmat(A , 2 , 3) ;

B(5 : 10 , 1 : 6)=1 ;

B(5 : 10 , 7 : 10)=2 ;

B



(2)随机彩色图的生成:rand()函数

%每个像素点都是随机彩色的随机彩图的生成方法。

clear all

k=100;          % k行k列的彩图


%先单独生成3个通道的数据,

r1=rand(k,k);

g1=rand(k,k);

b1=rand(k,k);


%再合并3个二维矩阵为一个三维的rgb矩阵

rgb=cat(3,r1,g1,b1);

imshow(rgb)


%或者用下列方法,更快捷!

k=100;  

rgb=rand( k , k , 3 );

imshow(rgb)

%如果想查看每个通道的灰度图,则采用 imshow(rgb2(:,:,1)) imshow(rgb2(:,:,2)) imshow(rgb2(:,:,3))命令

然而,上图虽然是彩色的,但是每个颜色只有一个像素点,该如何让每个色块变成100*100?




(3)3*3网格,每个网格100*100像素的的随机彩色图生成。

       

方法1:把3*3像素的小彩图,每个像素点都膨胀100倍。

方法2:先随机生成9个100*100像素的纯色图,然后拼接得到成品图案。


方法1:

clear all

n=100;                     %设置每个基础色块的像素值

o=ones( n , n , 3 );   %初始化rgb三维数组,初始值都设为0


rgb11=o.*rand(1,1,3);  %对每个色块随机染色。

rgb12=o.*rand(1,1,3);

rgb13=o.*rand(1,1,3);

rgb14=o.*rand(1,1,3);


rgb21=o.*rand(1,1,3);

rgb22=o.*rand(1,1,3);

rgb23=o.*rand(1,1,3);

rgb24=o.*rand(1,1,3);


rgb31=o.*rand(1,1,3);

rgb32=o.*rand(1,1,3);

rgb33=o.*rand(1,1,3);

rgb34=o.*rand(1,1,3);


rgb41=o.*rand(1,1,3);

rgb42=o.*rand(1,1,3);

rgb43=o.*rand(1,1,3);

rgb44=o.*rand(1,1,3);


rgb=[rgb11,rgb12,rgb13,rgb14;

         rgb21,rgb22,rgb23,rgb24;

         rgb31,rgb32,rgb33,rgb34;

         rgb41,rgb42,rgb43,rgb44];


imshow(rgb)



方法2:

clear all

n=100;                 %设置每个基础色块的像素值

o=ones( n , n , 3 );   %初始化rgb三维数组,初始值都设为0

color=rand(4,4,3);


rgb11=o.*color(1,1,:);  %对每个色块随机染色。

rgb12=o.*color(1,2,:);

rgb13=o.*color(1,3,:);

rgb14=o.*color(1,4,:);


rgb21=o.*color(2,1,:);  %对每个色块随机染色。

rgb22=o.*color(2,2,:);

rgb23=o.*color(2,3,:);

rgb24=o.*color(2,4,:);


rgb31=o.*color(3,1,:);  %对每个色块随机染色。

rgb32=o.*color(3,2,:);

rgb33=o.*color(3,3,:);

rgb34=o.*color(3,4,:);


rgb41=o.*color(4,1,:);  %对每个色块随机染色。

rgb42=o.*color(4,2,:);

rgb43=o.*color(4,3,:);

rgb44=o.*color(4,4,:);


rgb=[rgb11,rgb12,rgb13,rgb14;

         rgb21,rgb22,rgb23,rgb24;

         rgb31,rgb32,rgb33,rgb34;

         rgb41,rgb42,rgb43,rgb44];


imshow(rgb)


方法3:

%膨胀法(把小图的每个像素点膨胀后填充到大图的对应区域内)


clear all

k=4;             %设置网格为k*k

n=100;         %设置膨胀倍数n


rgb1=rand(k,k,3);   %原始的k*k像素的3通道小彩图

imshow(rgb1)  


%下面开始膨胀操作。

rgb=zeros( k*n , k*n , 3 );     %初始化rgb三维数组,初始值都设为0


rgb(1:100,1:100,:)  =repmat(rgb1(1,1,:),100,100) ;

rgb(1:100,101:200,:)=repmat(rgb1(1,2,:),100,100) ;

rgb(1:100,201:300,:)=repmat(rgb1(1,3,:),100,100);

rgb(1:100,301:400,:)=repmat(rgb1(1,4,:),100,100);


rgb(101:200,1:100,:)  =repmat(rgb1(2,1,:),100,100);

rgb(101:200,101:200,:)=repmat(rgb1(2,2,:),100,100);

rgb(101:200,201:300,:)=repmat(rgb1(2,3,:),100,100);

rgb(101:200,301:400,:)=repmat(rgb1(2,4,:),100,100);


rgb(201:300,1:100,:)  =repmat(rgb1(3,1,:),100,100);

rgb(201:300,101:200,:)=repmat(rgb1(3,2,:),100,100);

rgb(201:300,201:300,:)=repmat(rgb1(3,3,:),100,100);

rgb(201:300,301:400,:)=repmat(rgb1(3,4,:),100,100);


rgb(301:400,1:100,:)  =repmat(rgb1(4,1,:),100,100);

rgb(301:400,101:200,:)=repmat(rgb1(4,2,:),100,100);

rgb(301:400,201:300,:)=repmat(rgb1(4,3,:),100,100);

rgb(301:400,301:400,:)=repmat(rgb1(4,4,:),100,100);


imshow(rgb)




作业1:下图白色背景有某种红色和某种紫色字母等图案,请编程把图中红色和紫色部分的颜色替换成黄色,并且把背景从白色替换成蓝色。


效果如下图:

其中黄色的rgb值为:254,204,17;蓝色背景的rgb值为:47,144,188;





作业2:把两个图像融合到一张图像里。效果如下:

融合前:


融合后:


原理:假如pic1为600*600的图像,pic2也是600*600的图像,那么可以把pic1的第1行像素中的第1,3,5,7..599列的位置替换为pic2的第1行中的第1,3,5,7..599列的位置的像素;然后把pic1的第2行像素中的第2,4,6,8..600列的位置替换为pic2的第2行中的第2,4,6,8..600列的位置的像素;总之,奇数行的话,就把pic1的奇数列的位置像素替换成对应的pic2的像素,偶数行的话,就把pic1的列的位置像素替换成对应的pic2的像素。




作业3:图像的马赛克处理

马赛克的原理,就是把一个区域内的所有像素的值统一成一个值,消除像素之间的差异性。

要求:(1)先把一张彩色图片转换成灰度图。(2)把图片的行数和列数截取为100的整数倍,比如:如果图片大小为630*540,则保留为600*500。(3)把该灰度图按照20*20像素区块进行马赛克化处理。然后显示原图与马赛克化后的对比图。

效果如下图:






作业4:采用for循环生成如下随机n*m格的彩图

功能1:可以自定义n和m的数量,以及每个格子的像素

功能2:通过循环、pause()函数等技巧,来让如上的随机彩图每隔2秒钟刷新一次,刷新得最终次数自己来确定。需要固定图像,既,需要在imshow后面加hold on命令,以保证每次刷新图像的时候,图像位置固定。

....

imshow(rgb2)

pause(2)

hold on


程序暂停功能——pause()函数

pause(n):程序中出现pause(n)时将在继续执行下一条指令前暂停n秒,这里n可以是任意实数。时钟的精度是由MATLAB的工作平台所决定的,绝大多数工作平台都支持0.01秒的时间间隔。

%用法示例

x=linspace(0,9,10);

y=sin(x);

for k=1:10

      fprintf('当x=%f ,时,对应的y=%f  \n ', x(k),y(k) )

      pause(2)

end











扩展(选做)如何改造上面的程序,生产类似如下的图像。

下图1 为10*10的网格图,其中十字架形状是彩色的其他部分是灰度图(或者反之)



下图2中,圆形图案中为彩色,其他部分为灰色,想想该如何设计?大家也可以自己设计图案形状(如椭圆、三角形等)。


上图中,全图为600*600像素,色块格为6*6,每个色块为100*100像素。

提示:当一个点P(x,y)满足方程

或者时,这个点P(x,y)必然位于椭圆(中心点O(x0,y0))或者圆(半径为r, 中心点O(x0,y0))的内部.