├── README.md ├── 作业 ├── 2022数字图像处理习题.pptx ├── imageexercise.doc ├── 作业1 │ ├── 2.2.jpg │ ├── 2.3.png │ ├── 2.5.1.png │ ├── 2.5.2.png │ └── README.md ├── 作业2 │ ├── 3.3.jpg │ ├── 3.4.png │ ├── README.md │ ├── homework.m │ ├── lena.bmp │ ├── table.pdf │ ├── table.png │ └── table.tex ├── 作业3 │ └── README.md ├── 作业4 │ └── README.md ├── 作业5 │ └── README.md ├── 作业6 │ ├── 2.jpg │ ├── 3.png │ └── README.md ├── 作业7 │ └── README.md └── 作业8 │ ├── 4.jpg │ └── README.md └── 实验 ├── README.md ├── lab1(不用库函数) ├── 1.bmp ├── 1.jpg ├── La.m ├── alphabet1.jpg ├── alphabet2.jpg ├── debug.log ├── lab1_1.m ├── lab1_2.m ├── lab1_3.m ├── lab1_4.m └── lena.bmp ├── lab1 ├── alphabet1.jpg ├── alphabet2.jpg ├── lab1_1.m ├── lab1_2.m ├── lab1_3.m ├── lab1_4.m └── lena.bmp ├── lab2 ├── lab2_1.m ├── lab2_2.m ├── lab2_3.m ├── lab2_4.m ├── lena.bmp └── pout.bmp ├── lab3 ├── blood.bmp ├── lab3_1.m ├── lab3_2.m ├── lab3_3.m ├── lab3_4.m ├── lab3_6_1.m ├── lab3_6_2.m └── lena.bmp ├── lab4 ├── Girl.bmp ├── Rect1.bmp ├── Rect2.bmp ├── alphabet1.jpg ├── lab4_1.m ├── lab4_2.m ├── lab4_3.m ├── lab4_4.m ├── lab4_5.m └── pout.bmp ├── lab5 ├── cameraman.bmp ├── flower1.jpg ├── flower2.jpg ├── lab5_1.m ├── lab5_2.m ├── lab5_3.m └── lena.bmp ├── 实验报告截图 ├── lab1_图像几何失真校正.png ├── lab1_图像的平移.png ├── lab1_图像的旋转.png ├── lab1_图像的缩放.png ├── lab2_灰度拉伸.png ├── lab2_灰度的线性变换.png ├── lab2_灰度直方图.png ├── lab2_直方图均衡.png ├── lab3_中值滤波.png ├── lab3_均值滤波.png ├── lab3_超限中值滤波.png ├── lab3_超限均值滤波.png ├── lab3_边缘检测1.png ├── lab3_边缘检测2.png ├── lab4_Fourier变换.png ├── lab4_低通滤波-35.png ├── lab4_低通滤波-5.png ├── lab4_低通滤波-70.png ├── lab4_低通滤波-噪声.png ├── lab4_低通滤波-噪声2.png ├── lab4_直方图均衡与高频增强滤波.png ├── lab4_高通滤波-1.png ├── lab4_高通滤波-15.png ├── lab4_高通滤波-50.png ├── lab6_四叉树分裂合并.png ├── lab6_逆滤波与维纳滤波.png └── lab6_阈值分割.png └── 实验文档 ├── 图像处理实验.pdf └── 实验图像 ├── Couple.bmp ├── Girl.bmp ├── Rect1.bmp ├── Rect2.bmp ├── alphabet1.jpg ├── alphabet2.jpg ├── blood.bmp ├── cameraman.bmp ├── flower1.jpg ├── flower2.jpg ├── lena.bmp └── pout.bmp /README.md: -------------------------------------------------------------------------------- 1 | # USTC_2022_Digital-Image-Processing-and-Analysis 2 | 3 | 数字图像处理与分析 2022春 万寿红 课程作业 & 实验 4 | 5 | -------------------------------------------------------------------------------- /作业/2022数字图像处理习题.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/2022数字图像处理习题.pptx -------------------------------------------------------------------------------- /作业/imageexercise.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/imageexercise.doc -------------------------------------------------------------------------------- /作业/作业1/2.2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业1/2.2.jpg -------------------------------------------------------------------------------- /作业/作业1/2.3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业1/2.3.png -------------------------------------------------------------------------------- /作业/作业1/2.5.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业1/2.5.1.png -------------------------------------------------------------------------------- /作业/作业1/2.5.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业1/2.5.2.png -------------------------------------------------------------------------------- /作业/作业1/README.md: -------------------------------------------------------------------------------- 1 | # 第一次作业 2 | 3 | ## 2.1.空间点(1,2,3)经 $\lambda=0.5$ 的镜头透视后的摄像机坐标和图像平面坐标应是什么? 4 | 5 | 摄像机笛卡尔坐标为 6 | 7 | $$ 8 | \begin{bmatrix} 9 | \frac{\lambda X}{\lambda - Z} & \frac{\lambda Y}{\lambda - Z} & \frac{\lambda Z}{\lambda - Z} 10 | \end{bmatrix}^ \mathrm{ T } = \begin{bmatrix} 11 | -0.2 & -0.4 & -0.6 12 | \end{bmatrix}^ \mathrm{ T } 13 | $$ 14 | 15 | 图像平面笛卡尔坐标为 16 | 17 | $$ 18 | \begin{bmatrix} 19 | \frac{\lambda X}{\lambda - Z} & \frac{\lambda Y}{\lambda - Z} 20 | \end{bmatrix}^ \mathrm{ T } = \begin{bmatrix} 21 | -0.2 & -0.4 22 | \end{bmatrix}^ \mathrm{ T } 23 | $$ 24 | 25 | ## 2.2.设有2个图像子集如图所示,如果v={1}:![2.2](2.2.jpg) 子集S和子集T是否:①4—连通 ②8—连通 ③m—连通 26 | S和T ②8—连通 ③m—连通 27 | 28 | ## 2.3.考虑如图所示的图像子集:![2.3](2.3.png) 29 | 30 | 31 | 32 | ### (1)令v={0,1},计算p和q之间通路的D4 ,D8 和Dm长度 33 | 34 | 无D4通路 通路的D8最短长度:4 通路的Dm最短长度:5 35 | 36 | ### (2)令v={1,2},计算p和q之间通路的D4 ,D8 和Dm长度 37 | 38 | 通路的D4最短长度:6 通路的D8最短长度:4 通路的Dm最短长度:6 39 | 40 | ## 2.4.给出将图像顺时针旋转$45^o$的变换矩阵,并利用该矩阵旋转图像点(x,y)=(1,0) 41 | 42 | 变换矩阵为 43 | 44 | $$ 45 | \begin{bmatrix} 46 | \frac{\sqrt{2} }{2} & \frac{\sqrt{2} }{2} & 0 \\ 47 | -\frac{\sqrt{2} }{2} & \frac{\sqrt{2} }{2} & 0 \\ 48 | 0 & 0 & 1 49 | \end{bmatrix} 50 | $$ 51 | 52 | 利用该矩阵旋转 $(x,y)=(1,0)$ , 53 | 54 | $$ 55 | \begin{bmatrix} 56 | \frac{\sqrt{2} }{2}\\ 57 | -\frac{\sqrt{2} }{2}\\ 58 | 1 59 | \end{bmatrix}=\begin{bmatrix} 60 | \frac{\sqrt{2} }{2} & \frac{\sqrt{2} }{2} & 0 \\ 61 | -\frac{\sqrt{2} }{2} & \frac{\sqrt{2} }{2} & 0 \\ 62 | 0 & 0 & 1 63 | \end{bmatrix}\begin{bmatrix} 64 | 1\\ 65 | 0\\ 66 | 1 67 | \end{bmatrix} 68 | $$ 69 | 70 | 得到 $(x^{'},y^{'})=(\frac{\sqrt{2} }{2},-\frac{\sqrt{2} }{2})$ 71 | 72 | ## 2.5. 设给定如下平移变换矩阵T和尺度变换矩阵S,分别计算对空间点(1,2,3)先平移变换后尺度变换和先尺度变换后平移变换所得到的结果,并进行比较讨论。 73 | 74 | ## ![2.5.1](2.5.1.png) ![2.5.2](2.5.2.png) 75 | 76 | 先平移变换再尺度变换 77 | 78 | $$ 79 | \begin{bmatrix} 80 | 12\\ 81 | 18\\ 82 | 18\\ 83 | 1 84 | \end{bmatrix}= 85 | \begin{bmatrix} 86 | 4 & 0 & 0 & 0 \\ 87 | 0 & 3 & 0 & 0 \\ 88 | 0 & 0 & 2 & 0 \\ 89 | 0 & 0 & 0 & 1 90 | \end{bmatrix} \begin{bmatrix} 91 | 1 & 0 & 0 & 2 \\ 92 | 0 & 1 & 0 & 4 \\ 93 | 0 & 0 & 1 & 6 \\ 94 | 0 & 0 & 0 & 1 95 | \end{bmatrix}\begin{bmatrix} 96 | 1\\ 97 | 2\\ 98 | 3\\ 99 | 1 100 | \end{bmatrix} 101 | $$ 102 | 103 | 先尺度变换再平移变换 104 | 105 | $$ 106 | \begin{bmatrix} 107 | 6\\ 108 | 10\\ 109 | 12\\ 110 | 1 111 | \end{bmatrix}= 112 | \begin{bmatrix} 113 | 1 & 0 & 0 & 2 \\ 114 | 0 & 1 & 0 & 4 \\ 115 | 0 & 0 & 1 & 6 \\ 116 | 0 & 0 & 0 & 1 117 | \end{bmatrix} \begin{bmatrix} 118 | 4 & 0 & 0 & 0 \\ 119 | 0 & 3 & 0 & 0 \\ 120 | 0 & 0 & 2 & 0 \\ 121 | 0 & 0 & 0 & 1 122 | \end{bmatrix}\begin{bmatrix} 123 | 1\\ 124 | 2\\ 125 | 3\\ 126 | 1 127 | \end{bmatrix} 128 | $$ 129 | 130 | 先平移变换再尺度变换和先尺度变换再平移变换的结果不同,因为先进行平移变换时平移也会参与尺度变换,先尺度变换则不会。 131 | 132 | ## 2.6给出一个失真图上的三角形区域和校正图上与其对应的三角形区域,这两个三角形的顶点作为对应控制点,建立在线性失真情况下相对应的校正几何形变的空间变换式。 133 | 134 | 线性失真下校正几何形变的空间变换式为 135 | 136 | $$ 137 | \begin{bmatrix} 138 | x^{'}\\ 139 | y^{'}\\ 140 | 1 141 | \end{bmatrix}=\begin{bmatrix} 142 | a1 & a2 & a3\\ 143 | b1 & b2 & b3\\ 144 | 0 & 0 & 1 145 | \end{bmatrix}\begin{bmatrix} 146 | x\\ 147 | y\\ 148 | 1 149 | \end{bmatrix} 150 | $$ 151 | 152 | 其中a1,a2,a3,b1,b2,b3为六个未知参数,根据三角形的三组对应顶点可列出方程 153 | 154 | $$ 155 | \begin{bmatrix} 156 | x_{1} ^{'}\\ 157 | x_{2} ^{'}\\ 158 | x_{3} ^{'} 159 | \end{bmatrix}=\begin{bmatrix} 160 | x_{1} & y_{1} & 1\\ 161 | x_{2} & y_{2} & 1\\ 162 | x_{3} & y_{3} & 1 163 | \end{bmatrix}\begin{bmatrix} 164 | a_{1}\\ 165 | a_{2}\\ 166 | a_{3} 167 | \end{bmatrix} 168 | $$ 169 | 170 | 与 171 | 172 | $$ 173 | \begin{bmatrix} 174 | y_{1} ^{'}\\ 175 | y_{2} ^{'}\\ 176 | y_{3} ^{'} 177 | \end{bmatrix}=\begin{bmatrix} 178 | x_{1} & y_{1} & 1\\ 179 | x_{2} & y_{2} & 1\\ 180 | x_{3} & y_{3} & 1 181 | \end{bmatrix}\begin{bmatrix} 182 | b_{1}\\ 183 | b_{2}\\ 184 | b_{3} 185 | \end{bmatrix} 186 | $$ 187 | 188 | 六个方程六个未知参数即可求解出空间变换式对应的变换矩阵 189 | -------------------------------------------------------------------------------- /作业/作业2/3.3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业2/3.3.jpg -------------------------------------------------------------------------------- /作业/作业2/3.4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业2/3.4.png -------------------------------------------------------------------------------- /作业/作业2/README.md: -------------------------------------------------------------------------------- 1 | # 第二次作业 2 | 3 | ## 3.1为什么一般情况下对离散图像的直方图均衡化并不能产生完全平坦的直方图? 4 | 5 | ​ 在离散图像中,直方图均衡的变换函数为求和形式,是对连续图像的积分形式的近似,存在误差。同时,直方图均衡化前后是灰度级一对一或多对一的关系,因此不能产生理想的完全平坦的直方图。 6 | 7 | ## 3.2设已用直方图均衡化技术对一幅数字图像进行了增强,试证明再用这个方法对所得结果增强并不会改变其结果。 8 | 9 | ​ 在连续情况下,变换函数为 $s=\int_{0}^{r}p_r(x)dx$ ,在均衡化之后s的概率密度函数 $p_r(s)$ 满足 $p_s(s)\equiv 1$ ,再进行直方图均衡化时,变换函数为 $s'=\int_{0}^{s}p_s(x)dx=\int_{0}^{s}dx=s$ ,则再次直方图均衡化前后结果不变。 10 | 11 | ​ 在离散情况下,变换函数为 12 | 13 | $$ 14 | s_k={\sum_{i=0}^{k}} \frac{n_i}{n} 15 | $$ 16 | 17 | 对 $s_k$ 取整,得到 $S_k=int[(L-1)s_k+0.5]$ 。显然 $k\to S_k$ 的映射具有保序性,即若 $k_1 < k_2$ 有 $s_{k_1} < s_{k_2}$ ,则 $S_{k_1} < S_{k_2}$ 。对得到的增强图像再次进行直方图均衡化。若 $\nexists k\in [0,L-1] \quad s.t.S_k=j$ ,则在增强图像中灰度级为 $j$ 的像素个数为0,在第二次均衡化时不需考虑 $j$ 映射到的灰度级。若 $\exists k\in [0,L-1] \quad s.t.S_k=j$ ,则 18 | 19 | $$ 20 | s_{S_k}=\sum_{i=0}^{S_k}\frac{n^{'}_i}{n} 21 | $$ 22 | 23 | 则由保序性 24 | 25 | $$ 26 | s_{S_k}=\sum_{i=0}^{S_k}\frac{n^{'}_i}{n}=\sum_{i=0}^{k}\frac{n_i}{n}=s_k 27 | $$ 28 | 29 | 在第二次变换中,像素个数不为0的灰度级 $S_k$ 的映射关系 $S_k \to S_{S_k}(=S_k)$ 为恒同映射,可知再次直方图均衡化前后结果不变。 30 | 31 | ## 3.3设一幅图像有如下图(a)所示的直方图,拟对其进行规定直方图变换,所需规定直方图如下图(b)所示,使用SML方法,列表给出直方图规定化计算结果。 32 | 33 | ​ ![3.3](3.3.jpg) 34 | 35 | ![image-20220316194307125](table.png) 36 | 37 | ## 3.4编一个程序实现 $n \times n$ 中值滤波器。当模板中心移过图像中每个位置时,设计一种简便地更新中值的方法。(要求给出编程思想) 38 | 39 | ​ $n \times n$ 的中值滤波器的MATLAB实现如下 40 | 41 | ```matlab 42 | x = imread('lena.bmp'); 43 | n = 3; 44 | [r, c] = size(x); 45 | y = x; 46 | for i = 1 : r - (n - 1) 47 | for j = 1: c - (n - 1) 48 | y(i + (n - 1) / 2,j + (n - 1) / 2)=median(x(i : i + (n - 1),j:j + (n - 1)),'all'); 49 | end 50 | end 51 | 52 | ``` 53 | 54 | ​ 对加入椒盐噪声的Lena图以n=3进行中值滤波处理的前后效果如下 55 | 56 | ![image-20220316204345538](3.4.png) 57 | 58 | ​ 当 $n \times n$ 的模板横向或纵向移动时,每移动一格只有n个数发生变化,可以维护一个存储当前模板内 $n \times n$ 个数的队列,按模板移动时的出队次序入队,每次移动模板时,将队头的n个元素出队,将新加入的n个元素入队到队尾,即可得到模板移动后的 $n \times n$ 个元素,再使用排序算法得到中值。 59 | 60 | -------------------------------------------------------------------------------- /作业/作业2/homework.m: -------------------------------------------------------------------------------- 1 | x = imread('lena.bmp');%需要过滤的图像 2 | n = 3; 3 | [r, c] = size(x); 4 | x = imnoise(x,'salt & pepper'); 5 | y = x; 6 | for i = 1 : r - (n - 1) 7 | for j = 1: c - (n - 1) 8 | y(i + (n - 1) / 2,j + (n - 1) / 2)=median(x(i : i + (n - 1),j:j + (n - 1)),'all'); 9 | end 10 | end 11 | subplot(1,2,1); imshow(x); 12 | subplot(1,2,2); imshow(uint8(y)); 13 | 14 | 15 | -------------------------------------------------------------------------------- /作业/作业2/lena.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业2/lena.bmp -------------------------------------------------------------------------------- /作业/作业2/table.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业2/table.pdf -------------------------------------------------------------------------------- /作业/作业2/table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业2/table.png -------------------------------------------------------------------------------- /作业/作业2/table.tex: -------------------------------------------------------------------------------- 1 | \documentclass[12pt,UTF8]{ctexart} 2 | \begin{document} 3 | \begin{table}[] 4 | \begin{tabular}{cccccccccc} 5 | 序号 & 运算 & \multicolumn{8}{c}{步骤和结果} \\ 6 | 1 & 原始灰度级 & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\ 7 | 2 & 原始直方图 & 0.174 & 0.088 & 0.086 & 0.08 & 0.068 & 0.058 & 0.062 & 0.384 \\ 8 | 3 & 原始累计直方图 & 0.174 & 0.262 & 0.348 & 0.428 & 0.496 & 0.554 & 0.616 & 1.000 \\ 9 | 4 & 规定直方图 & 0.0 & 0.4 & 0.0 & 0.0 & 0.2 & 0.0 & 0.0 & 0.4 \\ 10 | 5 & 规定累计直方图 & 0.0 & 0.4 & 0.4 & 0.4 & 0.6 & 0.6 & 0.6 & 1.0 \\ 11 | 6 & SML & 1 & 1 & 1 & 1 & 1 & 4 & 4 & 7 \\ 12 | 7 & 映射关系 & \multicolumn{5}{c}{0,1,2,3,4 $\to$ 2} & \multicolumn{2}{c}{5,6 $\to$ 4} & 7 $\to$ 7 \\ 13 | 8 & 变换后直方图 & 0 & 0.496 & 0 & 0 & 0.120 & 0 & 0 & 0.384 14 | \end{tabular} 15 | \end{table} 16 | \end{document} -------------------------------------------------------------------------------- /作业/作业3/README.md: -------------------------------------------------------------------------------- 1 | # 第三次作业 2 | 3 | ## 4.1证明式 $f(x,y)exp[j2\pi(u_0x+v_0y)/N]\Leftrightarrow F(u-u_0,v-v_0)$ 和 $f(x-x_0,y-y_0)\Leftrightarrow F(u,v)exp[-j2\pi(ux_0+vy_0)/N]$ 成立 4 | 5 | 已知二维离散傅里叶变换公式 6 | 7 | $$ 8 | F(u,v)=\frac{1}{N}\sum_{x=0}^{N-1}\sum_{y=0}^{N-1} f(x,y)exp[-j2\pi(ux+vy)/N] 9 | $$ 10 | 11 | 则 12 | 13 | $$ 14 | \begin{align} 15 | F(u-u_0,v-v_0) & = \frac{1}{N}\sum_{x = 0}^{N-1}\sum_{y = 0}^{N-1} f(x,y)exp[-j2\pi((u-u_0)x+(v-v_0)y)/N]\\ 16 | & = \frac{1}{N}\sum_{x = 0}^{N-1}\sum_{y = 0}^{N-1} f(x,y)exp[j2\pi(u_0x+v_0y)/N]exp[-j2\pi(ux+vy)/N] 17 | \end{align} 18 | $$ 19 | 20 | 可知 $f(x,y)exp[j2\pi(u_0x+v_0y)/N]\Leftrightarrow F(u-u_0,v-v_0)$ 21 | 22 | 逆变换为 23 | 24 | $$ 25 | f(x,y)=\frac{1}{N}\sum_{u=0}^{N-1}\sum_{v=0}^{N-1} F(u,v)exp[j2\pi(ux+vy)/N] 26 | $$ 27 | 28 | 则 29 | 30 | $$ 31 | \begin{align} 32 | f(x-x_0,y-y_0)&=\frac{1}{N}\sum_{u=0}^{N-1}\sum_{v=0}^{N-1} F(u,v)exp[j2\pi(u(x-x_0)+v(y-y_0))/N]\\ 33 | &=\frac{1}{N}\sum_{u=0}^{N-1}\sum_{v=0}^{N-1} F(u,v)exp[-j2\pi(ux_0+vy_0)/N]exp[j2\pi(ux+vy)/N] 34 | \end{align} 35 | $$ 36 | 37 | 可知 $f(x-x_0,y-y_0)\Leftrightarrow F(u,v)exp[-j2\pi(ux_0+vy_0)/N]$ 38 | 39 | ## 4.2证明 $f(x)$ 的自相关函数的傅里叶变换就是 $f(x)$$的功率谱 $|F(u)|^2$ 40 | 41 | $f(x)$ 的自相关函数为 42 | 43 | $$ 44 | f(x)\circ f(x)=\int_{-\infty }^{\infty } f^*(\tau )f(x+\tau)d\tau 45 | $$ 46 | 47 | 其傅里叶变换为 48 | 49 | $$ 50 | \begin{align} 51 | \int_{-\infty }^{\infty } (f(x)\circ f(x))exp[-j2\pi ux]dx &=\int_{-\infty }^{\infty }[\int_{-\infty }^{\infty } f^*(\tau )f(x+\tau)d\tau] exp[-j2\pi ux]dx\\ 52 | &=\int_{-\infty }^{\infty }f^\*(\tau )[\int_{-\infty }^{\infty } f(x+\tau)exp[-j2\pi u(x+\tau)]dx] exp[j2\pi u\tau]d\tau\\ 53 | &=F(u)\int_{-\infty }^{\infty }f^\*(\tau )exp[j2\pi u\tau]d\tau\\ 54 | &=F(u)(\int_{-\infty }^{\infty }f(\tau )exp[-j2\pi u\tau]d\tau)^\*\\ 55 | &=F(u)F^\*(u)\\ 56 | &=|F(u)|^2 57 | \end{align} 58 | $$ 59 | 60 | ## 4.3证明离散傅里叶变换和反变换都是周期函数(为简便可以用1-D函数为例)。 61 | 62 | 1-D离散傅里叶变换公式为 63 | 64 | $$ 65 | F(u)=\frac{1}{N}\sum_{x=0}^{N-1} f(x)exp[-j2\pi ux/N] 66 | $$ 67 | 68 | 则 69 | 70 | $$ 71 | \begin{align} 72 | F(u+N)&=\frac{1}{N}\sum_{x=0}^{N-1} f(x)exp[-j2\pi (u+N)x/N]\\ 73 | &=\frac{1}{N}\sum_{x=0}^{N-1} f(x)exp[-j2\pi ux/N]exp[-j2\pi x]\\ 74 | &=\frac{1}{N}\sum_{x=0}^{N-1} f(x)exp[-j2\pi ux/N]\\ 75 | &=F(u) 76 | \end{align} 77 | $$ 78 | 79 | 1-D离散傅里叶逆变换公式为 80 | 81 | $$ 82 | f(x)=\sum_{u=0}^{N-1}F(u)exp[j2\pi ux/N] 83 | $$ 84 | 85 | 则 86 | 87 | $$ 88 | \begin{align} 89 | f(x+N)&=\sum_{u=0}^{N-1}F(u)exp[j2\pi u(x+N)/N]\\ 90 | &=\sum_{u=0}^{N-1}F(u)exp[j2\pi ux/N]exp[j2\pi u]\\ 91 | &=\sum_{u=0}^{N-1}F(u)exp[j2\pi ux/N]\\ 92 | &=f(x) 93 | \end{align} 94 | $$ 95 | -------------------------------------------------------------------------------- /作业/作业4/README.md: -------------------------------------------------------------------------------- 1 | # 第四次作业 2 | 3 | ## 1.讨论用于空间滤波的平滑滤波器和锐化滤波器的相同点、不同点以及联系。 4 | 5 | 相同点:平滑滤波器和锐化滤波器都是变换域增强的图像处理方式 6 | 7 | 不同点:平滑滤波器是采用低通滤波,锐化滤波器是采用高通滤波 8 | 9 | 联系:平滑滤波器和锐化滤波器相对应,常用的都为 10 | 11 | - 1.理想低通(高通)滤波器 12 | - 2.巴特沃斯低通(高通)滤波器 13 | - 3.指数低通(高通)滤波器 14 | - 4.梯形低通(高通)滤波器 15 | 16 | ## 2.在什么条件下式 $H(u,v)=\frac{1}{1+[D(u,v)/D_0]^{2n}}$ 的巴特沃思低通滤波器变成理想低通滤波器? 17 | 18 | 当参数 $n\rightarrow \infty$ 时,式 $H(u,v)=\frac{1}{1+[D(u,v)/D_0]^{2n}}$ 的巴特沃思低通滤波器变为式为 19 | 20 | $$ 21 | H(u,v)=\left\{\begin{matrix} 22 | &1,D(u,v)< D_0\\ 23 | &0,D(u,v)> D_0 24 | \end{matrix}\right. 25 | $$ 26 | 27 | 的理想低通滤波器 28 | 29 | ## 3.证明可以通过在频域内用原始图减去低通滤波图得到高通滤波的结果。 30 | 31 | 记频域内原始图为 $F(u,v)$ ,低通滤波器的变换函数为 $H(u,v)$ ,则低通滤波图为 $G(u,v)=F(u,v)H(u,v)$ ,用原始图减去低通滤波图得到 $G^{'}(u,v)=F(u,v)-G(u,v)=F(u,v)(1-H(u,v))=F(u,v)H^{'}(u,v)$ ,则 $H^{'}(u,v)=1-H(u,v)$ 为低通滤波器对应的高通滤波器的变换函数,则 $G^{'}(u,v)$ 即为高通滤波的结果 32 | 33 | ## 4.从巴特沃思低通滤波器出发推导它对应的高通滤波器。 34 | 35 | 若巴特沃思低通滤波器为 36 | 37 | $$ 38 | H(u,v)=\frac{1}{1+[D(u,v)/D_0]^{2n}} 39 | $$ 40 | 41 | 则其对应的高通滤波器为 42 | 43 | $$ 44 | H(u,v)=1-\frac{1}{1+[D(u,v)/D_0]^{2n}} =\frac{[D(u,v)/D_0]^{2n}}{1+[D(u,v)/D_0]^{2n}}=\frac{1}{1+[D_0/D(u,v)]^{2n}} 45 | $$ 46 | 47 | ## 5.有一种常用的图像增强技术是将高频增强和直方图均衡化结合起来以达到使边缘锐化的反差增强效果,以上两个操作的先后次序对增强效果有影响吗,为什么? 48 | 49 | 两个操作的先后次序对增强效果有影响,因为高频增强在变换域进行,是非线性变换,直方图均衡化在空间域进行,是线性变换,若先进行高频增强会使图像丢失低频的灰度信息 50 | -------------------------------------------------------------------------------- /作业/作业5/README.md: -------------------------------------------------------------------------------- 1 | # 第五次作业 2 | 3 | ## 1.设一幅图像的模糊是由物体在x和y方向上任意的匀速运动产生的,求转移函数H(u,v)。 4 | 5 | 设 $x_0(t)=at/T,y_0(t)=bt/T$ 为物体在x和y方向上的任意匀速运动,则转移函数 $H(u,v)$ 如下 6 | 7 | $$ 8 | \begin{align} 9 | H(u,v) & = \int_{0}^{T} e^{-j2\pi (ux_0(t)+vy_0(t))}dt\\ 10 | & = \int_{0}^{T} e^{\frac{-j2\pi (ua+vb)}{T}t }dt\\ 11 | & = \frac{T}{j2\pi (ua+vb)}\int_{0}^{j2\pi (ua+vb)} e^{-x}dx\\ 12 | & = \frac{T}{j2\pi (ua+vb)}(1-e^{j2\pi (ua+vb)}) 13 | \end{align} 14 | $$ 15 | 16 | ## 2.设一幅图像的模糊是由物体在x方向的匀加速运动产生的,当t=0时,物体静止,在t=0到t=T间物体加速度 $x_0(t)=at^2/2$ ,求转移函数H(u,v),并讨论匀速运动和匀加速运动所造成的模糊的不同特点。 17 | 18 | 转移函数 $H(u,v)$ 如下 19 | 20 | $$ 21 | \begin{align} 22 | H(u,v) & = \int_{0}^{T} e^{-j2\pi ux_0(t)}dt\\ 23 | & = \int_{0}^{T} e^{-j\pi uat^2 }dt\\ 24 | & = \int_{0}^{T} [cos(\pi uat^2)-jsin(\pi uat^2)]dt\\ 25 | & = \sqrt{\frac{1}{\pi ua}} \int_{0}^{\sqrt{\pi ua}T} [cos(x^2)-jsin(x^2)]dx 26 | \end{align} 27 | $$ 28 | 29 | 匀速运动在运动方向各处产生的模糊程度是相同的,匀加速运动随着t的增大,物体的运动速度增大,在运动方向上模糊程度逐渐增强,同时匀速运动的转移函数 $H(u,v)= \frac{T}{j2\pi (ua+vb)}(1-e^{j2\pi (ua+vb)})$ 有零点,而匀加速运动的转移函数 $H(u,v)= \sqrt{\frac{1}{\pi ua}} \int_{0}^{\sqrt{\pi ua}T} [cos(x^2)-jsin(x^2)]dx$ 无零点,可直接使用其倒数进行逆滤波 30 | 31 | ## 3.成像时由于长时间曝光受到大气干扰而产生的图像模糊可以用/转移函数 $H(u,v)=exp[-(u^2+v^2)/2{\sigma}^2]$ 表示。设噪声可忽略,求恢复这类模糊的维纳滤波的方程。 32 | 33 | 在忽略噪声时,维纳滤波退化为逆滤波,则恢复这类模糊的维纳滤波的方程如下 34 | 35 | $$ 36 | \begin{align} 37 | \hat{F}(u,v) & = \frac{1}{H(u,v)}G(u,v) \\ 38 | & = exp[(u^2+v^2)/2{\sigma}^2]G(u,v) 39 | \end{align} 40 | $$ 41 | -------------------------------------------------------------------------------- /作业/作业6/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业6/2.jpg -------------------------------------------------------------------------------- /作业/作业6/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业6/3.png -------------------------------------------------------------------------------- /作业/作业6/README.md: -------------------------------------------------------------------------------- 1 | # 第六次作业 2 | 3 | ## 1.(1)请说明是否能用变长编码压缩一幅已直方图均衡化的具有 $2^n$ 级灰度的图?(2)这样的图像中包含像素间冗余吗? 4 | 5 | ​ (1)不能,直方图均衡化后各灰度值出现的概率非常接近,采用变长编码难以压缩。 6 | 7 | ​ (2)这样的图像中可能包含像素间冗余,直方图是一维的,进行直方图均衡化后的图像在结构或几何关系上可能仍具有像素之间的相关性。 8 | 9 | ## 2. 10 | 11 | ![img](2.jpg) 12 | 13 | ### (1)计算下表中给出符号概率的信源的熵 14 | 15 | $$ 16 | -\sum_{i} p_i\log_{2}{p_i} = 2.65 17 | $$ 18 | 19 | ### (2)对信源符号构造哈夫曼码,解释这样构造的码与表中第2种码的区别 20 | 21 | | 符号 | 概率 | 码字 | 概率 | 码字 | 概率 | 码字 | 概率 | 码字 | 概率 | 码字 | 概率 | 码字 | 概率 | 码字 | 22 | | :--: | :--: | :----: | :--: | :---: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | ---- | 23 | | s1 | 0.25 | 01 | 0.25 | 01 | 0.25 | 01 | 0.25 | 01 | 0.35 | 00 | 0.4 | 1 | 0.6 | 0 | 24 | | s2 | 0.21 | 10 | 0.21 | 10 | 0.21 | 10 | 0.21 | 10 | 0.25 | 01 | 0.35 | 00 | 0.4 | 1 | 25 | | s0 | 0.19 | 11 | 0.19 | 11 | 0.19 | 11 | 0.19 | 11 | 0.21 | 10 | 0.25 | 01 | | | 26 | | s3 | 0.16 | 001 | 0.16 | 001 | 0.16 | 001 | 0.19 | 000 | 0.19 | 11 | | | | | 27 | | s4 | 0.08 | 0001 | 0.08 | 0001 | 0.11 | 0000 | 0.16 | 001 | | | | | | | 28 | | s5 | 0.06 | 00000 | 0.06 | 00000 | 0.08 | 0001 | | | | | | | | | 29 | | s6 | 0.03 | 000010 | 0.05 | 00001 | | | | | | | | | | | 30 | | s7 | 0.02 | 000011 | | | | | | | | | | | | | 31 | 32 | 这样构造的码和表中第二种码的平均长度相同,只是某一符号的码字不同 33 | 34 | ### (3)构造最优的B1码 35 | 36 | | 符号 | 概率 | 码字 | 37 | | :--: | :--: | :----: | 38 | | s1 | 0.25 | C0 | 39 | | s2 | 0.21 | C1 | 40 | | s0 | 0.19 | C0C0 | 41 | | s3 | 0.16 | C0C1 | 42 | | s4 | 0.08 | C1C0 | 43 | | s5 | 0.06 | C1C1 | 44 | | s6 | 0.03 | C0C0C0 | 45 | | s7 | 0.02 | C0C0C1 | 46 | 47 | ### (4)构造最优的2bit二元平移码 48 | 49 | | 符号 | 概率 | 码字 | 50 | | :--: | :--: | :------: | 51 | | s1 | 0.25 | 00 | 52 | | s2 | 0.21 | 01 | 53 | | s0 | 0.19 | 10 | 54 | | s3 | 0.16 | 11 00 | 55 | | s4 | 0.08 | 11 01 | 56 | | s5 | 0.06 | 11 10 | 57 | | s6 | 0.03 | 11 11 00 | 58 | | s7 | 0.02 | 11 11 01 | 59 | 60 | ### (5)将所有符号分成2组,每组4个,然后构造最优的哈夫曼平移码 61 | 62 | | 符号 | 概率 | 码字 | 63 | | :--: | :--: | :-----: | 64 | | s1 | 0.25 | 01 | 65 | | s2 | 0.21 | 10 | 66 | | s0 | 0.19 | 11 | 67 | | s3 | 0.16 | 001 | 68 | | s4 | 0.08 | 000 01 | 69 | | s5 | 0.06 | 000 10 | 70 | | s6 | 0.03 | 000 11 | 71 | | s7 | 0.02 | 000 001 | 72 | 73 | ### (6)对每个码计算平均字长,并将它们与(1)中算得的熵进行比较 74 | 75 | ​ (2) 哈夫曼码 2.7 76 | 77 | ​ (3) B1码 3.18 78 | 79 | ​ (4) 2bit二元平移码 2.8 80 | 81 | ​ (5) 哈夫曼平移码 2.75 82 | 83 | ​ 每个码的平均字长都大于熵,其中哈夫曼码最接近为最优码,其它三种为次优码 84 | 85 | ## 3.已知符号a,e,i,o,u,x的出现概率分别是0.2,0.3,0.1,0.2,0.1,0.1,对0.23355进行算术解码。 86 | 87 | ![img](3.png) 88 | 89 | ## 4.将下面给定的图像分解成3个位面,然后用游程编码方法逐行编码,给出码字,计算编码效率。 90 | 91 | | 1 | 0 | 0 | 0 | 4 | 4 | 0 | 0 | 92 | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | 93 | | 1 | 0 | 0 | 7 | 4 | 4 | 0 | 0 | 94 | | 1 | 2 | 0 | 7 | 6 | 5 | 4 | 3 | 95 | | 2 | 2 | 2 | 2 | 6 | 6 | 0 | 0 | 96 | 97 | 二值位平面(bit0) 98 | 99 | | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 100 | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | 101 | | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 102 | | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 103 | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 104 | 105 | 游程编码 1b 7W; 1b 2W 1b 4W; 1b 2W 1b 1W 1b 1W 1b; 0b 8W 106 | 107 | 二值位平面(bit1) 108 | 109 | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 110 | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | 111 | | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 112 | | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 113 | | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 114 | 115 | 游程编码 0b 8W; 0b 3W 1b 4W; 0b 1W 1b 1W 2b 2W 1b; 6b 2W 116 | 117 | 二值位平面(bit2) 118 | 119 | | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 120 | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | 121 | | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 122 | | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 123 | | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 124 | 125 | 游程编码 0b 4W 2b 2W; 0b 3W 3b 2W; 0b 3W 4b 1W; 0b 4W 2b 2W 126 | 127 | 以上游程编码约定以黑色游程为起始 128 | 129 | 计数值最大为8,使用3bit表示,游程编码所需比特数为46*3=138 130 | 131 | | 符号 | 概率 | 132 | | :--: | :--: | 133 | | 0 | 3/8 | 134 | | 1 | 3/32 | 135 | | 2 | 5/32 | 136 | | 3 | 1/32 | 137 | | 4 | 5/32 | 138 | | 5 | 1/32 | 139 | | 6 | 3/32 | 140 | | 7 | 1/16 | 141 | 142 | 原图像的信息熵为 $-\sum_{i} p_i\log_{2}{p_i}*32(图像的像素数) = 82.25$ ,编码效率为 $82.25/138=59.6\%$ 143 | -------------------------------------------------------------------------------- /作业/作业7/README.md: -------------------------------------------------------------------------------- 1 | # 第七次作业 2 | 3 | ## 1 一幅图像背景部分的均值为25、方差为625,在背景上分布着一些互不重叠的均值为150、方差为400的小目标。设所有目标合起来约占图像总面积的20%,提出一个阈值分割算法将这些目标分割出来。 4 | 5 | ​ 图像的背景和目标部分的均值相差125,背景部分均方差为25,目标的均方差为20,背景和目标的均方差都较小,可以采用单一阈值分割的方法。 6 | 7 | ​ 选取阈值的方法可采用依赖像素的阈值选取,图像的直方图应呈现双峰,两图像的均值之间相差约有 $125/(25+20)\approx 3$ 个标准差的距离,交错范围较小,且目标总和约占总面积百分之二十,两峰高度相差可以接受,可在直方图中找到两个极大值点,并以两个极大值点中间的极小值点作为阈值对图像进行分割,将大于阈值的部分认为是需要分割出来的目标。 8 | 9 | ## 2 一幅图像背景部分的均值为25、方差为625,在背景上分布着一些互不重叠的均值为150、方差为400的小目标。设所有目标合起来约占图像总面积的20%,提出一种基于区域生长的方法将这些目标分割出来。 10 | 11 | ​ 图像的背景和目标部分的均值相差125,背景部分均方差为25,目标的均方差为20,可以假设背景和目标满足正态分布,则以 $25\pm 25$ 作为背景种子,以 $150\pm 20$ 作为目标种子,即将各自均值一个均方差以内的像素点认为是种子。背景的取值上界50距目标均值的距离为100,为5个目标的均方差,像素为 $25\pm 25$ 的点为目标的概率可忽略不计;目标的取值下界130距背景均值的距离为105,约为4个目标的均方差,像素为 $150\pm 20$ 的点为背景的概率可忽略不计。所以上述种子的选取是合理的。 12 | 13 | ​ 选取种子后,以种子作为生长起点,生长准则为相邻点与种子的灰度差不超过对应区域的均方差(即背景的种子与相邻点不超过25,目标的种子与相邻点不超过20),将满足生长准则的相邻点也作为种子,重复生长直到再没有新的种子出现。 14 | -------------------------------------------------------------------------------- /作业/作业8/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/作业/作业8/4.jpg -------------------------------------------------------------------------------- /作业/作业8/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 第八次作业 6 | 7 | ## 1 8 | 9 | ### (1)解释为什么利用链码起点归一化方法可使所得链码与边界的起点无关? 10 | 11 | ​ 不同起点的链码可以通过循环移位互相转换,在循环移位的所有可能结果中,选最小的一个以归一化,由于不同起点的链码在循环移位意义下相同,它们有共同的归一化结果,只与目标有关,而与边界的起点无关。 12 | 13 | ### (2)求出对链码11076765543322进行起点归一化后的起点和链码。 14 | 15 | ​ 对原链码循环移位使其最小,得到归一化的链码为07676554332211,起点为0 16 | 17 | ## 2 18 | 19 | ### (1)解释为什么利用链码旋转归一化方法可使所得链码与边界的旋转无关? 20 | 21 | ​ 链码旋转归一化使用链码的循环首差(一阶差分)来代替链码,链码会由于旋转产生的方向变化而改变,但链码的一阶差分只与边界的形状相关而与方向无关,因此可以在旋转下保持不变。 22 | 23 | ### (2)求出链码0101030303323232212111的循环首差链码。 24 | 25 | ​ 3131331313031313031300 26 | 27 | ## 3 28 | 29 | ### (1)对下面的四幅图讨论求骨架算法第一步在点p的操作。 30 | 31 | | **1** | **1** | **0** | 32 | | ----- | ----- | ----- | 33 | | **1** | **P** | **0** | 34 | | **1** | **1** | **0** | 35 | 36 | | **0** | **0** | **0** | 37 | | ----- | ----- | ----- | 38 | | **1** | **P** | **0** | 39 | | **0** | **0** | **0** | 40 | 41 | | **0** | **1** | **0** | 42 | | ----- | ----- | ----- | 43 | | **1** | **P** | **1** | 44 | | **0** | **1** | **0** | 45 | 46 | | **1** | **1** | **0** | 47 | | ----- | ----- | ----- | 48 | | **0** | **P** | **1** | 49 | | **0** | **0** | **0** | 50 | 51 | 对第一幅图 52 | 53 | $N(p) = 5 \quad S(p)=1 \quad p_2\*p_4\*p_6=0 \quad p_4\*p_6\*p_8=0$ 54 | 55 | 对第二幅图 56 | 57 | $N(p) = 1 \quad S(p)=1 \quad p_2\*p_4\*p_6=0 \quad p_4\*p_6\*p_8=0$ 58 | 59 | 对第三幅图 60 | 61 | $N(p) = 4 \quad S(p)=4 \quad p_2\*p_4\*p_6=1 \quad p_4\*p_6\*p_8=1$ 62 | 63 | 对第四幅图 64 | 65 | $N(p) = 3 \quad S(p)=2 \quad p_2\*p_4\*p_6=0 \quad p_4\*p_6\*p_8=0$ 66 | 67 | 只有第一幅图同时满足四个条件,可以打删除标记 68 | 69 | ### (2)同上讨论第二步。 70 | 71 | 对第一幅图 72 | 73 | $N(p) = 5 \quad S(p)=1 \quad p_2\*p_4\*p_6=0 \quad p_4\*p_6\*p_8=1$ 74 | 75 | 对第二幅图 76 | 77 | $N(p) = 1 \quad S(p)=1 \quad p_2\*p_4\*p_6=0 \quad p_4\*p_6\*p_8=0$ 78 | 79 | 对第三幅图 80 | 81 | $N(p) = 4 \quad S(p)=4 \quad p_2\*p_4\*p_6=1 \quad p_4\*p_6\*p_8=1$ 82 | 83 | 对第四幅图 84 | 85 | $N(p) = 3 \quad S(p)=2 \quad p_2\*p_4\*p_6=0 \quad p_4\*p_6\*p_8=0$ 86 | 87 | 四幅图都不同时满足四个条件 88 | 89 | ## 4.求下图中目标的形状数和形状数的阶。 90 | 91 | ![4](4.jpg) 92 | 93 | 以左上角为起点 94 | 95 | 链码:000332123211 96 | 97 | 循环首差:300303311330 98 | 99 | 形状数:003033113303 100 | 101 | 形状数的阶:12 102 | -------------------------------------------------------------------------------- /实验/README.md: -------------------------------------------------------------------------------- 1 | # 图像处理上机报告 2 | 3 | ## 实验一 图像几何变换 4 | 5 | ### 1、 图像的平移 6 | 7 | - 使用`imread`读取灰度图像 8 | 9 | - 使用`input`函数获得水平和垂直平移量 10 | - 使用`imtranslate`对图像进行平移 11 | - 使用`imshow`显示平移前后的图像对比 12 | 13 | ```matlab 14 | source = imread('lena.bmp'); 15 | tx = input("水平平移量:"); 16 | ty = input("垂直平移量:"); 17 | output = imtranslate(source,[tx,ty]); 18 | subplot(1,2,1); imshow(source); title('原图'); 19 | subplot(1,2,2); imshow(output); title('平移后'); 20 | ``` 21 | 22 | ![图像的平移](实验报告截图/lab1_图像的平移.png) 23 | 24 | ### 2、图像的旋转 25 | 26 | - 使用`imread`读取灰度图像 27 | 28 | - 使用`input`函数获得旋转角度 29 | - 使用`imrotate`对图像进行旋转,选择`最近邻插值`和`双线性插值` 30 | - 使用`imshow`显示`最近邻插值`和`双线性插值`的图像对比 31 | 32 | ```matlab 33 | source = imread('lena.bmp'); 34 | angle = input("旋转角度:"); 35 | output1 = imrotate(source,angle,'nearest','crop');%nearest为最近邻插值 36 | output2 = imrotate(source,angle,'bilinear','crop');%bilinear为双线性插值 37 | subplot(1,2,1); imshow(output1);title('最近邻插值'); 38 | subplot(1,2,2); imshow(output2);title('双线性插值'); 39 | ``` 40 | 41 | ![图像的旋转](实验报告截图/lab1_图像的旋转.png) 42 | 43 | ### 3、图像的缩放 44 | 45 | - 使用`imread`读取灰度图像 46 | 47 | - 使用`input`函数获得水平和垂直缩放量 48 | - 使用`imresize`对图像进行缩放,选择`最近邻插值`和`双线性插值` 49 | - 使用`imshow`显示`最近邻插值`和`双线性插值`的图像对比 50 | 51 | ```matlab 52 | source = imread('lena.bmp'); 53 | [r,l] = size(source); 54 | x = input("水平缩放量:"); 55 | y = input("垂直缩放量:"); 56 | output1 = imresize(source,[r*y,l*x],'nearest');%nearest为最近邻插值 57 | output2 = imresize(source,[r*y,l*x],'bilinear');%bilinear为双线性插值 58 | subplot(1,2,1); imshow(output1);title('最近邻插值'); 59 | subplot(1,2,2); imshow(output2);title('双线性插值'); 60 | ``` 61 | 62 | ![图像的缩放](实验报告截图/lab1_图像的缩放.png) 63 | 64 | ### 4、图像几何失真校正 65 | 66 | - 使用`imread`读取几何失真图像与原图 67 | - 使用`imshow`显示几何失真图像与原图 68 | 69 | - 使用`ginput`函数获得控制点对 70 | - 使用`fitgeotrans`基于控制点对对几何变换进行拟合 71 | - 使用`imwarp`应用几何变换校正几何失真,选择`最近邻插值`和`双线性插值` 72 | - 使用`imshow`显示`最近邻插值`和`双线性插值`的图像对比 73 | 74 | ```matlab 75 | source = imread('alphabet2.jpg'); 76 | origin = imread('alphabet1.jpg'); 77 | subplot(1,2,1); imshow(source); 78 | subplot(1,2,2); imshow(origin); 79 | [x, y] = ginput(8);%获得几何失真图像与原图一一对应的四组控制点对 80 | movingPoints = [x(1) y(1);x(3) y(3);x(5) y(5);x(7) y(7)];%几何失真图像控制点 81 | fixedPoints = [x(2) y(2);x(4) y(4);x(6) y(6);x(8) y(8)];%原图控制点 82 | tform = fitgeotrans(movingPoints,fixedPoints,'projective');%对几何变换拟合 83 | output1 = imwarp(source,tform,'nearest');%nearest为最近邻插值 84 | output2 = imwarp(source,tform,'bilinear');%bilinear为双线性插值 85 | subplot(1,2,1); imshow(output1);title('最近邻插值'); 86 | subplot(1,2,2); imshow(output2);title('双线性插值'); 87 | ``` 88 | 89 | ![图像几何失真校正](实验报告截图/lab1_图像几何失真校正.png) 90 | 91 | ## 实验二 图像点处理增强 92 | 93 | ### 1、灰度的线性变换 94 | 95 | - 使用`imread`读取灰度图像 96 | 97 | - 使用`input`函数获得斜率和截距 98 | - 对图像上的每个点进行线性映射 99 | - 使用`imshow`显示线性变换前后的图像对比 100 | 101 | ```matlab 102 | source = imread('lena.bmp'); 103 | [r,l] = size(source); 104 | output = zeros(r,l); 105 | fa = input("斜率:"); 106 | fb = input("截距:"); 107 | for i = 1 : r 108 | for j = 1 : l 109 | output(i,j) = source(i,j)*fa+fb;%进行线性映射 110 | end 111 | end 112 | subplot(1,2,1); imshow(source); title('原图'); 113 | subplot(1,2,2); imshow(uint8(output)); title('线性变换后'); 114 | ``` 115 | 116 | ![lab2_灰度的线性变换](实验报告截图/lab2_灰度的线性变换.png) 117 | 118 | ### 2、灰度拉伸 119 | 120 | - 使用`imread`读取灰度图像 121 | 122 | - 使用`input`函数获得转折点 123 | - 使用自己定义的函数对图像进行灰度拉伸 124 | - 使用`imshow`显示灰度拉伸前后的图像对比 125 | 126 | ```matlab 127 | source = imread('lena.bmp'); 128 | [r,l] = size(source); 129 | output = zeros(r,l); 130 | x1 = input("x1:"); 131 | y1 = input("y1:"); 132 | x2 = input("x2:"); 133 | y2 = input("y2:"); 134 | for i = 1 : r 135 | for j = 1 : l 136 | output(i,j) = f(source(i,j),x1,y1,x2,y2);%进行线性映射 137 | end 138 | end 139 | subplot(1,2,1); imshow(source); title('原图'); 140 | subplot(1,2,2); imshow(uint8(output)); title('灰度拉伸后'); 141 | 142 | function [fx] = f(x,x1,y1,x2,y2)%灰度拉伸函数 143 | if(x < x1) 144 | fx = y1 / x1 * x; 145 | else 146 | if(x <= x2) 147 | fx = (y2 - y1)/(x2 - x1)*(x - x1) + y1; 148 | else 149 | fx = (255 - y2)/(255 - x2)*(x - x2) + y2; 150 | end 151 | end 152 | end 153 | ``` 154 | 155 | ![lab2_灰度拉伸](实验报告截图/lab2_灰度拉伸.png) 156 | 157 | ### 3、灰度直方图 158 | 159 | - 使用`imread`读取灰度图像 160 | - 使用`input`函数获得灰度直方图的下限和上限 161 | - 使用`histogram`显示给定范围内的灰度直方图 162 | 163 | ```matlab 164 | source = imread('lena.bmp'); 165 | min = input("下限:"); 166 | max = input("上限:"); 167 | histogram(source,'BinLimits',[min,max])%显示给定范围的灰度直方图 168 | ``` 169 | 170 | ![lab2_灰度直方图](实验报告截图/lab2_灰度直方图.png) 171 | 172 | ### 4、直方图均衡 173 | 174 | - 使用`imread`读取灰度图像 175 | - 使用`imshow`显示原图和原图直方图 176 | 177 | - 使用`histeq`函数进行直方图均衡 178 | - 使用`imshow`显示直方图均衡后的结果和对应的直方图 179 | - 使用`histeq`进行直方图规定化,使用`normpdf`得到规定化所需的高斯函数 180 | - 使用`imshow`显示直方图规定化后的结果和对应的直方图 181 | 182 | ```matlab 183 | source = imread('pout.bmp'); 184 | subplot(3,2,1); imshow(source); title('原图'); 185 | subplot(3,2,2); histogram(source);title('原图直方图'); 186 | output1 = histeq(source);%直方图均衡 187 | subplot(3,2,3); imshow(output1);title('直方图均衡'); 188 | subplot(3,2,4); histogram(output1);title('增强后直方图'); 189 | output2 = histeq(source,normpdf((0:1:255),127,40));%使用均值127,标准差40的高斯函数进行规定化 190 | subplot(3,2,5); imshow(output2);title('直方图规定化'); 191 | subplot(3,2,6); histogram(output2);title('规定化后直方图'); 192 | ``` 193 | 194 | ![lab2_直方图均衡](实验报告截图/lab2_直方图均衡.png) 195 | 196 | ## 实验三 图像空间域滤波增强 197 | 198 | ### 1、用均值滤波器去除图像中的噪声(选 3x3 窗口) 199 | 200 | - 使用`imread`读取灰度图像 201 | - 使用`imnoise`函数添加椒盐噪声和高斯噪声 202 | - 编写了`Random`函数用于获取随机脉冲噪声 203 | - 对每个噪声图像使用`imfilter`应用`fspecial`生成的3x3均值滤波器 204 | - 使用`imshow`显示增强前后的图像对比 205 | 206 | ```matlab 207 | source = imread('lena.bmp'); 208 | %添加噪声 209 | pepper = imnoise(source,'salt & pepper',0.03); 210 | gaussian = imnoise(source,'gaussian'); 211 | random = Random(source); 212 | %均值滤波 213 | pepper_output = imfilter(pepper,fspecial('average',3)); 214 | gaussian_output = imfilter(gaussian,fspecial('average',3)); 215 | poisson_output = imfilter(random,fspecial('average',3)); 216 | subplot(2,4,1); imshow(source); title('原图'); 217 | subplot(2,4,2); imshow(pepper); title('3%椒盐噪声'); 218 | subplot(2,4,3); imshow(gaussian); title('高斯噪声'); 219 | subplot(2,4,4); imshow(random); title('随机噪声'); 220 | subplot(2,4,6); imshow(pepper_output); title('3%椒盐噪声均值滤波'); 221 | subplot(2,4,7); imshow(gaussian_output); title('高斯噪声均值滤波'); 222 | subplot(2,4,8); imshow(poisson_output); title('随机噪声均值滤波'); 223 | 224 | %随机噪声 225 | function [output] = Random(input) 226 | output = imnoise(input,'salt & pepper',0.03); 227 | [r,l] = size(output); 228 | for i = 1 : r 229 | for j = 1 : l 230 | if(output(i,j) ~= input(i,j)) 231 | output(i,j) = uint8(rand()*255); 232 | end 233 | end 234 | end 235 | end 236 | ``` 237 | 238 | ![均值滤波](实验报告截图/lab3_均值滤波.png) 239 | 240 | ### 2、用超限邻域平均法去除图像中的噪声:如果某个像素的灰度值大于其邻域像素的平均值,且达到了一定水平,则判断该像素为噪声,继而用邻域像素的均值取代这一像素值, 241 | 242 | - 使用`imread`读取灰度图像 243 | - 使用`imnoise`函数添加椒盐噪声和高斯噪声 244 | - 编写了`Random`函数用于获取随机脉冲噪声 245 | - 编写了`filter`函数进行3x3超限邻域滤波,其中用`mean`函数获得3x3范围内的均值 246 | - 使用`imshow`显示增强前后的图像对比 247 | 248 | ```matlab 249 | source = imread('lena.bmp'); 250 | %添加噪声 251 | pepper = imnoise(source,'salt & pepper',0.03); 252 | gaussian = imnoise(source,'gaussian'); 253 | random = Random(source); 254 | %超限邻域平均滤波 255 | pepper_output = filter(pepper,35); 256 | gaussian_output = filter(gaussian,35); 257 | poisson_output = filter(random,35); 258 | subplot(2,4,1); imshow(source); title('原图'); 259 | subplot(2,4,2); imshow(pepper); title('3%椒盐噪声'); 260 | subplot(2,4,3); imshow(gaussian); title('高斯噪声'); 261 | subplot(2,4,4); imshow(random); title('随机噪声'); 262 | subplot(2,4,6); imshow(pepper_output); title('3%椒盐噪声超限邻域平均滤波'); 263 | subplot(2,4,7); imshow(gaussian_output); title('高斯噪声超限邻域平均滤波'); 264 | subplot(2,4,8); imshow(poisson_output); title('随机噪声超限邻域平均滤波'); 265 | 266 | function [output] = filter(input,T) 267 | output = input; 268 | [r,l] = size(output); 269 | for i = 2 : (r - 1) 270 | for j = 2 : (l - 1) 271 | mean_value = mean(mean(input(i - 1 : i + 1, j - 1 : j + 1)));%计算均值 272 | if(abs(double(input(i,j)) - mean_value) > T)%超限滤波 273 | output(i,j) = mean_value; 274 | end 275 | end 276 | end 277 | end 278 | 279 | %随机噪声 280 | function [output] = Random(input) 281 | output = imnoise(input,'salt & pepper',0.03); 282 | [r,l] = size(output); 283 | for i = 1 : r 284 | for j = 1 : l 285 | if(output(i,j) ~= input(i,j)) 286 | output(i,j) = uint8(rand()*255); 287 | end 288 | end 289 | end 290 | end 291 | ``` 292 | 293 | 阈值为35的结果如下 294 | 295 | ![超限均值滤波](实验报告截图/lab3_超限均值滤波.png) 296 | 297 | ### 3、用中值滤波器去除图像中的噪声(选 3x3 窗口做中值滤波) 298 | 299 | - 使用`imread`读取灰度图像 300 | - 使用`imnoise`函数添加椒盐噪声和高斯噪声 301 | - 编写了`Random`函数用于获取随机脉冲噪声 302 | - 对每个噪声图像使用`medfilt2`进行中值滤波 303 | - 使用`imshow`显示增强前后的图像对比 304 | 305 | ```matlab 306 | source = imread('lena.bmp'); 307 | %添加噪声 308 | pepper = imnoise(source,'salt & pepper',0.03); 309 | gaussian = imnoise(source,'gaussian'); 310 | random = Random(source); 311 | %中值滤波 312 | pepper_output = medfilt2(pepper); 313 | gaussian_output = medfilt2(gaussian); 314 | speckle_output = medfilt2(random); 315 | subplot(2,4,1); imshow(source); title('原图'); 316 | subplot(2,4,2); imshow(pepper); title('3%椒盐噪声'); 317 | subplot(2,4,3); imshow(gaussian); title('高斯噪声'); 318 | subplot(2,4,4); imshow(random); title('随机噪声'); 319 | subplot(2,4,6); imshow(pepper_output); title('3%椒盐噪声中值滤波'); 320 | subplot(2,4,7); imshow(gaussian_output); title('高斯噪声中值滤波'); 321 | subplot(2,4,8); imshow(speckle_output); title('随机噪声中值滤波'); 322 | 323 | %随机噪声 324 | function [output] = Random(input) 325 | output = imnoise(input,'salt & pepper',0.03); 326 | [r,l] = size(output); 327 | for i = 1 : r 328 | for j = 1 : l 329 | if(output(i,j) ~= input(i,j)) 330 | output(i,j) = uint8(rand()*255); 331 | end 332 | end 333 | end 334 | end 335 | ``` 336 | 337 | ![中值滤波](实验报告截图/lab3_中值滤波.png) 338 | 339 | ### 4、用超限中值滤波器去除图像中的噪声:当某个像素的灰度值超过窗口中像素灰度值排序中间的那个值,且达到一定水平时,则判断该点为噪声,用灰度值排序中间的那个值来代替;否则还是保持原来的灰度值。 340 | 341 | - 使用`imread`读取灰度图像 342 | - 使用`imnoise`函数添加椒盐噪声和高斯噪声 343 | - 编写了`Random`函数用于获取随机脉冲噪声 344 | - 编写了`filter`函数进行3x3超限中值滤波,其中用`median`函数获得3x3范围内的中值 345 | - 使用`imshow`显示增强前后的图像对比 346 | 347 | ```matlab 348 | source = imread('lena.bmp'); 349 | %添加噪声 350 | pepper = imnoise(source,'salt & pepper',0.03); 351 | gaussian = imnoise(source,'gaussian'); 352 | random = Random(source); 353 | %超限中值滤波 354 | pepper_output = filter(pepper,35); 355 | gaussian_output = filter(gaussian,35); 356 | speckle_output = filter(random,35); 357 | subplot(2,4,1); imshow(source); title('原图'); 358 | subplot(2,4,2); imshow(pepper); title('3%椒盐噪声'); 359 | subplot(2,4,3); imshow(gaussian); title('高斯噪声'); 360 | subplot(2,4,4); imshow(random); title('随机噪声'); 361 | subplot(2,4,6); imshow(pepper_output); title('3%椒盐噪声超限中值滤波'); 362 | subplot(2,4,7); imshow(gaussian_output); title('高斯噪声超限中值滤波'); 363 | subplot(2,4,8); imshow(speckle_output); title('随机噪声超限中值滤波'); 364 | 365 | %随机噪声 366 | function [output] = filter(input,T) 367 | output = input; 368 | [r,l] = size(output); 369 | for i = 2 : (r - 1) 370 | for j = 2 : (l - 1) 371 | temp = input(i - 1 : i + 1, j - 1 : j + 1); 372 | middle_value = median(temp(:)); 373 | if(abs(double(input(i,j)) - double(middle_value)) > T) 374 | output(i,j) = middle_value; 375 | end 376 | end 377 | end 378 | end 379 | 380 | function [output] = Random(input) 381 | output = imnoise(input,'salt & pepper',0.03); 382 | [r,l] = size(output); 383 | for i = 1 : r 384 | for j = 1 : l 385 | if(output(i,j) ~= input(i,j)) 386 | output(i,j) = uint8(rand()*255); 387 | end 388 | end 389 | end 390 | end 391 | ``` 392 | 393 | ![超限中值滤波](实验报告截图/lab3_超限中值滤波.png) 394 | 395 | ### 5.将四种处理方法的结果与原图比较,注意不同处理方法对边缘的影响。 396 | 397 | - 四种处理结果中,超限均值滤波的效果好于均值滤波,超限中值滤波的效果好于中值滤波 398 | - 中值滤波与超限中值滤波对于边缘细节的保留更好,均值滤波和超限均值滤波的边缘更平滑 399 | - 对椒盐噪声和随机噪声,中值滤波与超限中值滤波效果较好 400 | - 对高斯噪声,均值滤波和超限均值滤波效果较好 401 | 402 | ### 6. 边缘检测主要有以下几种常用的算子: 403 | 404 | #### 1) Roberts 算子 405 | 406 | #### 2) Sobel 算子 407 | 408 | #### 3) Prewitt 算子 409 | 410 | #### 4) 拉普拉斯算子 411 | 412 | #### 5) Canny 算子 413 | 414 | #### 要求:要求对 blood.bmp、 lena.bmp,分别用前面所述的算子进行边缘检测,显示边缘检测结果图像。 415 | 416 | - 使用`imread`读取灰度图像 417 | - 使用`edge`函数分别使用`Roberts 算子`、`Sobel 算子`、`Prewitt 算子`、`Canny 算子`进行边缘检测 418 | - 使用`imfilter`应用两种`拉普拉斯算子`进行边缘检测 419 | - 使用`imshow`显示边缘检测结果图像 420 | 421 | ```matlab 422 | source = imread('lena.bmp'); 423 | %Roberts算子 424 | Roberts = edge(source,'Roberts'); 425 | %Sobel算子 426 | Sobel = edge(source,'Sobel'); 427 | %Prewitt算子 428 | Prewitt = edge(source,'Prewitt'); 429 | %拉普拉斯算子 430 | Laplacian1 = imfilter(source,fspecial('laplacian',0)); 431 | Laplacian2 = imfilter(source,[-1 -1 -1; -1 8 -1; -1 -1 -1]); 432 | %Canny算子 433 | Canny = edge(source,'Canny'); 434 | 435 | subplot(3,3,[1,3]); imshow(source); title('原图'); 436 | subplot(3,3,4); imshow(Roberts); title('Roberts'); 437 | subplot(3,3,5); imshow(Sobel); title('Sobel'); 438 | subplot(3,3,6); imshow(Prewitt); title('Prewitt'); 439 | subplot(3,3,7); imshow(Laplacian1); title('Laplacian1'); 440 | subplot(3,3,8); imshow(Laplacian2); title('Laplacian2'); 441 | subplot(3,3,9); imshow(Canny); title('Canny'); 442 | ``` 443 | 444 | ```matlab 445 | source = imread('blood.bmp'); 446 | %Roberts算子 447 | Roberts = edge(source,'Roberts'); 448 | %Sobel算子 449 | Sobel = edge(source,'Sobel'); 450 | %Prewitt算子 451 | Prewitt = edge(source,'Prewitt'); 452 | %拉普拉斯算子 453 | Laplacian1 = imfilter(source,-fspecial('laplacian',0)); 454 | Laplacian2 = imfilter(source,[-1 -1 -1; -1 8 -1; -1 -1 -1]); 455 | %Canny算子 456 | Canny = edge(source,'Canny'); 457 | 458 | subplot(3,3,[1,3]); imshow(source); title('原图'); 459 | subplot(3,3,4); imshow(Roberts); title('Roberts'); 460 | subplot(3,3,5); imshow(Sobel); title('Sobel'); 461 | subplot(3,3,6); imshow(Prewitt); title('Prewitt'); 462 | subplot(3,3,7); imshow(Laplacian1); title('Laplacian1'); 463 | subplot(3,3,8); imshow(Laplacian2); title('Laplacian2'); 464 | subplot(3,3,9); imshow(Canny); title('Canny'); 465 | 466 | ``` 467 | 468 | ![边缘检测1](实验报告截图/lab3_边缘检测1.png)![边缘检测2](实验报告截图/lab3_边缘检测2.png) 469 | 470 | ## 实验四 图像变换及频域滤波增强 471 | 472 | ### Fourier 变换与反变换 473 | 474 | #### 1. 用 Fourier 变换算法,对 rect1.bmp 和 rect2.bmp 图像作二维 Fourier 变换;并显示其频谱。要求对幅度作变换(由于高、低频幅度相差很大),将低频移到中心点。 475 | 476 | - 使用`imread`读取灰度图像 477 | - 使用`fft2`对图像进行二维Fourier 变换 478 | - 使用`fftshift`将图像的低频移至中心 479 | - 使用`abs`将图像取幅度,得到幅度的变换结果 480 | - 使用`imshow`显示频谱的幅度谱 481 | 482 | #### 2. 用 Fourier 系数的幅度进行 Fourier 反变换,并显示其图像; 483 | 484 | - 使用`imread`读取灰度图像 485 | - 使用`fft2`对图像进行二维Fourier 变换 486 | - 使用`abs`将图像取幅度,得到幅度的变换结果 487 | - 使用`ifft2`将Fourier 系数的幅度进行 Fourier 反变换 488 | - 使用`imshow`显示反变换的结果 489 | 490 | #### 3. 用 Fourier 系数的相位进行 Fourier 反变换,并显示其图像;比较 3、4 的结果,评价人眼对图像幅频特性和相频特性的敏感度。 491 | 492 | - 使用`imread`读取灰度图像 493 | - 使用`fft2`对图像进行二维Fourier 变换 494 | - 使用`angle`得到 Fourier 变换后的相位谱 495 | - 使用`exp`将相位谱做以增强 496 | - 使用`ifft2`将Fourier 系数的相位进行 Fourier 反变换 497 | - 使用`imshow`显示反变换的结果 498 | 499 | ​ 根据幅度和相位进行 Fourier 反变换的结果可知,幅频特性包含了图像亮度(能量)的分布,相频特性刻画了图像的边界轮廓信息,人眼对相频特性比幅频特性敏感,从相频特性中可以看出图像的轮廓从而知道图像的大致内容,而从幅频特性中只能看到亮暗分布,不知道图像所含的物体是什么。 500 | 501 | #### 4. 将图像的 Fourier 变换置为其共轭后进行反变换,显示其图像,并与原始图像比较其差异。 502 | 503 | - 使用`imread`读取灰度图像 504 | - 使用`fft2`对图像进行二维Fourier 变换 505 | - 使用`conj`将图像的 Fourier 变换置为其共轭 506 | - 使用`ifft2`进行 Fourier 反变换 507 | - 使用`imshow`显示反变换的结果 508 | 509 | ​ 观察结果可知得到的图像是原始图像的对角镜像(相当于先进行水平镜像再进行垂直镜像),这是因为傅里叶变换的共轭对称性$F(u,v)=F^*(-u,-v)$ 510 | 511 | ```matlab 512 | source1 = imread('Rect1.bmp'); 513 | source2 = imread('Rect2.bmp'); 514 | %傅里叶变换 515 | F1 = fft2(source1); 516 | F2 = fft2(source2); 517 | %移动低频至中心并增强 518 | F1_shift = log(abs(fftshift(F1))+1); 519 | F2_shift = log(abs(fftshift(F2))+1); 520 | %幅度逆变换 521 | IF1_abs = uint8(ifft2(abs(F1))); 522 | IF2_abs = uint8(ifft2(abs(F2))); 523 | %相位逆变换 524 | IF1_angle = uint8(abs(ifft2(10000*exp(1i*angle(F1))))); 525 | IF2_angle = uint8(abs(ifft2(10000*exp(1i*angle(F2))))); 526 | %共轭逆变换 527 | IF1_conj = ifft2(conj(F1)); 528 | IF2_conj = ifft2(conj(F2)); 529 | subplot(2,5,1); imshow(source1); title('rect1'); 530 | subplot(2,5,2); imshow(F1_shift,[]); title('rect1幅度谱'); 531 | subplot(2,5,3); imshow(IF1_abs); title('rect1幅度逆变换'); 532 | subplot(2,5,4); imshow(IF1_angle); title('rect1相位逆变换'); 533 | subplot(2,5,5); imshow(IF1_conj,[]); title('rect1傅里叶变换共轭逆变换'); 534 | subplot(2,5,6); imshow(source2); title('rect2'); 535 | subplot(2,5,7); imshow(F2_shift,[]); title('rect2幅度谱'); 536 | subplot(2,5,8); imshow(IF2_abs); title('rect2幅度逆变换'); 537 | subplot(2,5,9); imshow(IF2_angle); title('rect2相位逆变换'); 538 | subplot(2,5,10); imshow(IF2_conj,[]); title('rect2傅里叶变换共轭逆变换'); 539 | ``` 540 | 541 | ![Fourier变换](实验报告截图/lab4_Fourier变换.png) 542 | 543 | ### 频域滤波 544 | 545 | #### 5. 对图像 pout.bmp、Girl.bmp 分别采用理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器(截止频率自选),再做反变换,观察不同截止频率下采用不同低通滤波器得到的图像与原图像的区别,特别注意振铃效应。 546 | 547 | - 使用`imread`读取灰度图像 548 | - 编写`ILPF`、`BLPF`、`ELPF`三个函数进行理想低通滤波、巴特沃斯低通滤波、高斯低通滤波 549 | - 使用`size`获得图像的大小 550 | - 使用`fft2`与`fftshift`对图像进行 Fourier 变换并将低频移至中心 551 | - 使用`meshgrid`构建坐标矩阵 552 | - 使用`hypot`在坐标矩阵上计算各点到中心点的距离 553 | - 使用`ifft2`与`ifftshift`撤销`fftshift`的移动并进行逆 Fourier 变换 554 | - 使用`imshow`显示低通滤波后的结果 555 | 556 | ```matlab 557 | source1 = imread('Pout.bmp'); 558 | source2 = imread('Girl.bmp'); 559 | D = 35; 560 | subplot(2,4,1); imshow(source1,[]); title('Pout'); 561 | subplot(2,4,2); imshow(ILPF(source1,D),[]); title('Pout理想低通滤波器'); 562 | subplot(2,4,3); imshow(BLPF(source1,D,1),[]); title('Pout巴特沃斯低通滤波器'); 563 | subplot(2,4,4); imshow(ELPF(source1,D,2),[]); title('Pout高斯低通滤波器'); 564 | subplot(2,4,5); imshow(source2); title('Girl'); 565 | subplot(2,4,6); imshow(ILPF(source2,D),[]); title('Girl理想低通滤波器'); 566 | subplot(2,4,7); imshow(BLPF(source2,D,1),[]); title('Girl巴特沃斯低通滤波器'); 567 | subplot(2,4,8); imshow(ELPF(source2,D,2),[]); title('Girl高斯低通滤波器'); 568 | 569 | %理想低通滤波器 570 | function output = ILPF(input,D0) 571 | [r,l] = size(input); 572 | F = fftshift(fft2(input));%傅里叶变换并平移 573 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 574 | D = hypot(U,V);%计算中心偏移距离 575 | H = D <= D0 ; 576 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 577 | end 578 | 579 | %巴特沃斯低通滤波器 580 | function output = BLPF(input,D0,n) 581 | [r,l] = size(input); 582 | F = fftshift(fft2(input));%傅里叶变换并平移 583 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 584 | D = hypot(U,V);%计算中心偏移距离 585 | H = 1./(1+((D./D0).^(2*n))); 586 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 587 | end 588 | 589 | %高斯低通滤波器 590 | function output = ELPF(input,D0,n) 591 | [r,l] = size(input); 592 | F = fftshift(fft2(input));%傅里叶变换并平移 593 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 594 | D = hypot(U,V);%计算中心偏移距离 595 | H = exp(-(D./D0).^n); 596 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 597 | end 598 | ``` 599 | 600 | 阈值35的低通滤波 601 | 602 | ![低通滤波-35](实验报告截图/lab4_低通滤波-35.png) 603 | 604 | 阈值5的低通滤波 605 | 606 | ![低通滤波-5](实验报告截图/lab4_低通滤波-5.png) 607 | 608 | 阈值70的低通滤波 609 | 610 | ![低通滤波-70](实验报告截图/lab4_低通滤波-70.png) 611 | 612 | ​ 在较低阈值下,图像最平滑,但细节保留较少,理想低通滤波的振铃效应明显。在适中阈值下,图像得到了平滑,保留了较多细节,理想低通滤波相比另两种滤波有一定的振铃效应。在较高阈值下,图像在滤波前后没有明显变化,理想低通滤波的振铃效应也不可察觉。 613 | 614 | #### 6. 对原始图像 Girl.bmp 分别加椒盐噪声、高斯噪声,产生有噪声图像,利用上述低通滤波器进行去噪,对比去噪效果。 615 | 616 | - 使用`imread`读取灰度图像 617 | - 使用`imnoise`添加椒盐噪声、高斯噪声 618 | - 编写`ILPF`、`BLPF`、`ELPF`三个函数进行理想低通滤波、巴特沃斯低通滤波、高斯低通滤波 619 | - 使用`size`获得图像的大小 620 | - 使用`fft2`与`fftshift`对图像进行 Fourier 变换并将低频移至中心 621 | - 使用`meshgrid`构建坐标矩阵 622 | - 使用`hypot`在坐标矩阵上计算各点到中心点的距离 623 | - 使用`ifft2`与`ifftshift`撤销`fftshift`的移动并进行逆 Fourier 变换 624 | - 使用`imshow`显示噪声图像低通滤波后的结果 625 | 626 | ```matlab 627 | source1 = imread('Pout.bmp'); 628 | source2 = imread('Girl.bmp'); 629 | %添加噪声 630 | source1_pepper = imnoise(source1,'salt & pepper',0.03); 631 | source1_gaussian = imnoise(source1,'gaussian'); 632 | source2_pepper = imnoise(source2,'salt & pepper',0.03); 633 | source2_gaussian = imnoise(source2,'gaussian'); 634 | 635 | figure(); 636 | subplot(3,3,1); imshow(source1,[]); title('Pout'); 637 | subplot(3,3,2); imshow(source1_pepper,[]); title('Pout-椒盐噪声'); 638 | subplot(3,3,3); imshow(source1_gaussian,[]); title('Pout-高斯噪声'); 639 | subplot(3,3,4); imshow(ILPF(source1_pepper,35),[]); title('Pout-椒盐噪声理想低通滤波器'); 640 | subplot(3,3,5); imshow(BLPF(source1_pepper,35,1),[]); title('Pout-椒盐噪声巴特沃斯低通滤波器'); 641 | subplot(3,3,6); imshow(ELPF(source1_pepper,35,2),[]); title('Pout-椒盐噪声高斯低通滤波器'); 642 | subplot(3,3,7); imshow(ILPF(source1_gaussian,35),[]); title('Pout-高斯噪声理想低通滤波器'); 643 | subplot(3,3,8); imshow(BLPF(source1_gaussian,35,1),[]); title('Pout-高斯噪声巴特沃斯低通滤波器'); 644 | subplot(3,3,9); imshow(ELPF(source1_gaussian,35,2),[]); title('Pout-高斯噪声高斯低通滤波器'); 645 | 646 | figure(); 647 | subplot(3,3,1); imshow(source2,[]); title('Girl'); 648 | subplot(3,3,2); imshow(source2_pepper,[]); title('Girl-椒盐噪声'); 649 | subplot(3,3,3); imshow(source2_gaussian,[]); title('Girl-高斯噪声'); 650 | subplot(3,3,4); imshow(ILPF(source2_pepper,35),[]); title('Girl-椒盐噪声理想低通滤波器'); 651 | subplot(3,3,5); imshow(BLPF(source2_pepper,35,1),[]); title('Girl-椒盐噪声巴特沃斯低通滤波器'); 652 | subplot(3,3,6); imshow(ELPF(source2_pepper,35,1),[]); title('Girl-椒盐噪声高斯低通滤波器'); 653 | subplot(3,3,7); imshow(ILPF(source2_gaussian,35),[]); title('Girl-高斯噪声理想低通滤波器'); 654 | subplot(3,3,8); imshow(BLPF(source2_gaussian,35,1),[]); title('Girl-高斯噪声巴特沃斯低通滤波器'); 655 | subplot(3,3,9); imshow(ELPF(source2_gaussian,35,1),[]); title('Girl-高斯噪声高斯低通滤波器'); 656 | 657 | %理想低通滤波器 658 | function output = ILPF(input,D0) 659 | [r,l] = size(input); 660 | F = fftshift(fft2(input));%傅里叶变换并平移 661 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 662 | D = hypot(U,V);%计算中心偏移距离 663 | H = D <= D0 ; 664 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 665 | end 666 | 667 | %巴特沃斯低通滤波器 668 | function output = BLPF(input,D0,n) 669 | [r,l] = size(input); 670 | F = fftshift(fft2(input));%傅里叶变换并平移 671 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 672 | D = hypot(U,V);%计算中心偏移距离 673 | H = 1./(1+((D./D0).^(2*n))); 674 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 675 | end 676 | 677 | %高斯低通滤波器 678 | function output = ELPF(input,D0,n) 679 | [r,l] = size(input); 680 | F = fftshift(fft2(input));%傅里叶变换并平移 681 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 682 | D = hypot(U,V);%计算中心偏移距离 683 | H = exp(-(D./D0).^n); 684 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 685 | end 686 | ``` 687 | 688 | ![低通滤波-噪声](实验报告截图/lab4_低通滤波-噪声.png) 689 | 690 | ![低通滤波-噪声2](实验报告截图/lab4_低通滤波-噪声2.png) 691 | 692 | ​ 理想低通滤波器的振铃效果较为明显,降噪效果较差。巴特沃斯低通滤波和高斯低通滤波没有振铃效应,降噪效果基本相同,都优于理想低通滤波。 693 | 694 | #### 7. 对图像 pout.bmp、Girl.bmp 分别采用高通滤波器、巴特沃斯高通滤波器和高斯高通滤波器(截止频率自选),再做反变换,观察不同截止频率下采用不同高通滤波器得到的图像与原图像的区别,特别注意振铃效应。 695 | 696 | - 使用`imread`读取灰度图像 697 | - 编写`ILPF`、`BLPF`、`ELPF`三个函数进行理想高通滤波、巴特沃斯高通滤波、高斯高通滤波 698 | - 使用`size`获得图像的大小 699 | - 使用`fft2`与`fftshift`对图像进行 Fourier 变换并将低频移至中心 700 | - 使用`meshgrid`构建坐标矩阵 701 | - 使用`hypot`在坐标矩阵上计算各点到中心点的距离 702 | - 使用`ifft2`与`ifftshift`撤销`fftshift`的移动并进行逆 Fourier 变换 703 | - 使用`imshow`显示高通滤波后的结果 704 | 705 | ```matlab 706 | source1 = imread('Pout.bmp'); 707 | source2 = imread('Girl.bmp'); 708 | D = 15 ; 709 | subplot(2,4,1); imshow(source1,[]); title('Pout'); 710 | subplot(2,4,2); imshow(ILPF(source1,D),[]); title('Pout理想高通滤波器'); 711 | subplot(2,4,3); imshow(BLPF(source1,D,1),[]); title('Pout巴特沃斯高通滤波器'); 712 | subplot(2,4,4); imshow(ELPF(source1,D,2),[]); title('Pout高斯高通滤波器'); 713 | subplot(2,4,5); imshow(source2); title('Girl'); 714 | subplot(2,4,6); imshow(ILPF(source2,D),[]); title('Girl理想高通滤波器'); 715 | subplot(2,4,7); imshow(BLPF(source2,D,1),[]); title('Girl巴特沃斯高通滤波器'); 716 | subplot(2,4,8); imshow(ELPF(source2,D,2),[]); title('Girl高斯高通滤波器'); 717 | 718 | %理想高通滤波器 719 | function output = ILPF(input,D0) 720 | [r,l] = size(input); 721 | F = fftshift(fft2(input));%傅里叶变换并平移 722 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 723 | D = hypot(U,V);%计算中心偏移距离 724 | H = D > D0 ; 725 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 726 | end 727 | 728 | %巴特沃斯高通滤波器 729 | function output = BLPF(input,D0,n) 730 | [r,l] = size(input); 731 | F = fftshift(fft2(input));%傅里叶变换并平移 732 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 733 | D = hypot(U,V);%计算中心偏移距离 734 | H = 1./(1+((D0./D).^(2*n))); 735 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 736 | end 737 | 738 | %高斯高通滤波器 739 | function output = ELPF(input,D0,n) 740 | [r,l] = size(input); 741 | F = fftshift(fft2(input));%傅里叶变换并平移 742 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 743 | D = hypot(U,V);%计算中心偏移距离 744 | H = exp(-(D0./D).^n); 745 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 746 | end 747 | ``` 748 | 749 | 阈值15的高通滤波 750 | 751 | ![高通滤波-15](实验报告截图/lab4_高通滤波-15.png) 752 | 753 | 阈值1的高通滤波 754 | 755 | ![image-20220515183104336](实验报告截图/lab4_高通滤波-1.png) 756 | 757 | 阈值50的高通滤波 758 | 759 | ![高通滤波-50](实验报告截图/lab4_高通滤波-50.png) 760 | 761 | ​ 在较高阈值下,图像保留的低频信息较少,图像最暗,部分不明显的轮廓被丢弃,理想高通滤波有振铃效应。在适中阈值下,保留了部分低频信息,提取出了高频的图像轮廓,理想高通滤波有一定振铃效应。在较低阈值下,图像在滤波前后没有明显变化,理想高通滤波的振铃效应也不可察觉。 762 | 763 | #### 8. 对图像 pout.bmp 经过高频增强滤波,再进行直方图均衡化,显示结果图像; 对图像 pout.bmp 先进行直方图均衡化,再经过高频增强滤波,显示结果图像;观察对比不同处理顺序对结果图像的影响。 764 | 765 | - 使用`imread`读取灰度图像 766 | - 编写`ILPF`、`BLPF`、`ELPF`三个函数进行理想高频增强滤波、巴特沃斯高频增强滤波、高斯高频增强滤波 767 | - 使用`size`获得图像的大小 768 | - 使用`fft2`与`fftshift`对图像进行 Fourier 变换并将低频移至中心 769 | - 使用`meshgrid`构建坐标矩阵 770 | - 使用`hypot`在坐标矩阵上计算各点到中心点的距离 771 | - 使用`ifft2`与`ifftshift`撤销`fftshift`的移动并进行逆 Fourier 变换 772 | - 使用`histeq`进行直方图均衡化 773 | - 使用`imshow`显示 先高频增强滤波后直方图均衡 和 先直方图均衡再高频增强滤波的结果 774 | 775 | ```matlab 776 | source = imread('Pout.bmp'); 777 | D = 15; 778 | n = 1; 779 | a = 4; 780 | b = 1; 781 | subplot(2,4,1); imshow(source,[]); title('Pout'); 782 | subplot(2,4,2); imshow(histeq(uint8(ILPF(source,D,a,b)))); title('Pout理想高频-直方图'); 783 | subplot(2,4,3); imshow(histeq(uint8(BLPF(source,D,n,a,b)))); title('Pout巴特沃斯高频-直方图'); 784 | subplot(2,4,4); imshow(histeq(uint8(ELPF(source,D,n,a,b)))); title('Pout高斯高频-直方图'); 785 | subplot(2,4,6); imshow(ILPF(histeq(source),D,a,b),[]); title('Pout直方图-理想高频'); 786 | subplot(2,4,7); imshow(BLPF(histeq(source),D,n,a,b),[]); title('Pout直方图-巴特沃斯高频'); 787 | subplot(2,4,8); imshow(ELPF(histeq(source),D,n,a,b),[]); title('Pout直方图-高斯高频'); 788 | 789 | %理想高频滤波器 790 | function output = ILPF(input,D0,a,b) 791 | [r,l] = size(input); 792 | F = fftshift(fft2(input));%傅里叶变换并平移 793 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 794 | D = hypot(U,V);%计算中心偏移距离 795 | H = D > D0 ; 796 | H = a * H + b; 797 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 798 | end 799 | 800 | %巴特沃斯高频滤波器 801 | function output = BLPF(input,D0,n,a,b) 802 | [r,l] = size(input); 803 | F = fftshift(fft2(input));%傅里叶变换并平移 804 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 805 | D = hypot(U,V);%计算中心偏移距离 806 | H = 1./(1+((D0./D).^(2*n))); 807 | H = a * H + b; 808 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 809 | end 810 | 811 | %高斯高频滤波器 812 | function output = ELPF(input,D0,n,a,b) 813 | [r,l] = size(input); 814 | F = fftshift(fft2(input));%傅里叶变换并平移 815 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 816 | D = hypot(U,V);%计算中心偏移距离 817 | H = exp((-D0./D).^n); 818 | H = a * H + b; 819 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 820 | end 821 | ``` 822 | 823 | 阈值为15,高频增强方程为$H_e(u,v)=4H(u,v)+1$的结果如下 824 | 825 | ![直方图均衡与高频增强滤波](实验报告截图/lab4_直方图均衡与高频增强滤波.png) 826 | 827 | ​ 先高频增强滤波再直方图均衡得到的图像较亮,先直方图均衡再高频增强滤波得到的图像较暗。这是因为直方图均衡可以让图像灰度分布均匀,因此高频增强滤波后直方图均衡得到较亮的结果。但先直方图均衡再高频增强滤波时,由于图像的能量集中在低频,高频增强滤波后图像失去大部分能量,因此较暗。 828 | 829 | ## 实验五 图像恢复与图像分割 830 | 831 | ### 1. 对图像 flower1.jpg 设置运动位移 30 个像素、运动方向 45 度,产生运动模糊图像,对其采用逆滤波和维纳滤波进行恢复,显示、对比分析恢复结果图像。对产生的运动模糊图像加高斯噪声,产生有噪声图像,分别对其采用逆滤波和维纳滤波进行恢复,显示、对比分析恢复结果图像。 832 | 833 | - 使用`imread`读取灰度图像 834 | - 使用`im2double`将图像的元素类型转换为double以便于后续计算方差 835 | - 使用`fspecial`获得运动模糊滤波器 836 | - 使用`imfilter`将运动模糊应用于原图像得到运动模糊的图像 837 | - 使用`imnoise`在添加了运动模糊的图像上添加高斯噪声 838 | - 使用`deconvwnr`进行逆滤波和维纳滤波,在无估计噪声的情况下,将噪信比设为0,维纳滤波退化为逆滤波。将噪信比指定为高斯噪声与图像的方差比就可以进行维纳滤波 839 | - 使用`imshow`显示运动模糊图像、同时添加运动模糊与高斯噪声的图像、对这两种图像分别应用逆滤波和维纳滤波的结果 840 | 841 | ```matlab 842 | source = im2double(imread('flower1.jpg')); 843 | psf = fspecial('motion',30,45);%运动模糊滤波器 844 | motion = imfilter(source,psf,'conv','circular');%产生运动模糊 845 | noisy = imnoise(motion,'gauss',0,0.0001);%产生高斯噪声 846 | 847 | subplot(2,4,1); imshow(source); title('flower1'); 848 | subplot(2,4,2); imshow(motion); title('flower1运动模糊'); 849 | subplot(2,4,3); imshow(deconvwnr(motion,psf)); title('flower1运动模糊逆滤波'); 850 | subplot(2,4,4); imshow(deconvwnr(motion,psf)); title('flower1运动模糊维纳滤波'); 851 | subplot(2,4,6); imshow(noisy); title('flower1运动模糊&高斯噪声'); 852 | subplot(2,4,7); imshow(deconvwnr(noisy,psf)); title('flower1运动模糊&高斯噪声逆滤波'); 853 | subplot(2,4,8); imshow(deconvwnr(noisy,psf,0.0001/var(motion(:)))); title('flower1运动模糊&高斯噪声维纳滤波'); 854 | ``` 855 | 856 | ![逆滤波与维纳滤波](实验报告截图/lab6_逆滤波与维纳滤波.png) 857 | 858 | ​ 在只添加运动模糊的情况下,逆滤波和维纳滤波本质上是等价的,都可以恢复得到原始图像。在同时添加运动模糊和高斯噪声的情况下,进行逆滤波时高频的高斯噪声会被放大,得到的结果效果很差,在进行维纳滤波时可以抑制噪声得到较好的结果,但噪声并不能完全去除,相比原图仍有一定噪声,这是因为虽然噪信比已知,但高斯噪声在图像上的分布是随机的,无法完全恢复。 859 | 860 | ### 2. 对图像 lena.bmp 采用大津法(OTSU)自动选取阈值进行分割,显示分割二值化结果图像。 861 | 862 | - 使用`imread`读取灰度图像 863 | - 编写`OSTU`函数使用大津法(OTSU)自动选取阈值。其中`miu`为均值累计矩阵,其第`i+2`项为灰度为`[0,i]`间的像素的均值,w为概率累计矩阵,其第`i+2`项为像素处于`[0,i]`的概率,之后用两个矩阵计算所有的类间方差矩阵g,取类间方差矩阵的最大值得到分割阈值T 864 | - 使用`imbinarize`根据阈值将图像分割产生二值图像 865 | - 使用`imshow`显示分别根据编写的`OSTU`函数和`Matlab`的库函数`graythresh`得到的阈值进行分割的结果 866 | 867 | ```matlab 868 | source = imread('lena.bmp'); 869 | subplot(1,3,1); imshow(source); title('lena'); 870 | subplot(1,3,2); imshow(imbinarize(source, OSTU(source))); title('分割二值化结果'); 871 | subplot(1,3,3); imshow(imbinarize(source, graythresh(source))); title('分割二值化结果'); 872 | 873 | function T = OSTU(input) 874 | [r, l] = size(input); 875 | N = r * l;%获得像素点数 876 | miu = zeros(257);%均值累计矩阵 877 | w = zeros(257);%概率累计矩阵 878 | for i = 0 : 255 879 | p = length(find(input == i)) / N;%像素为i的像素所占比例 880 | miu(i+2) = miu(i+1) + p * i; 881 | w(i+2) = w(i+1) + p; 882 | end 883 | g = (w./(1-w)).*(miu./w-miu(257)).^2; 884 | T = (find(g==max(g))- 2)/255; 885 | end 886 | ``` 887 | 888 | ![阈值分割](实验报告截图/lab6_阈值分割.png) 889 | 890 | 库函数与编写的`OSTU`函数得到的结果相同 891 | 892 | ### 3. 对图像 cameraman.bmp 采用四叉树表达的迭代区域分裂合并算法进行分割。显示分割结果图像。 893 | 894 | - 使用`imread`读取灰度图像 895 | 896 | - 使用`qtdecomp`得到对原图像进行四叉树分割后的稀疏矩阵 897 | 898 | - 使用`qtsetblk`设置各个大小的块的边界以获得分割图像 899 | 900 | - 使用`imshow`显示分割后的图像 901 | 902 | - 使用`qtgetblk`得到各个大小的块后,给每个块不同的编号 903 | 904 | - 使用`boundarymask`得到指定编号的边界,再根据边界的编号查找相邻块 905 | 906 | - 使用`range`得到合并区域的极差,将合并后能够小于阈值的块合并 907 | 908 | - 使用`imshow`显示分割后的图像 909 | 910 | ```matlab 911 | source = imread('cameraman.bmp'); 912 | subplot(1,3,1); imshow(source); title('原图'); 913 | range_value = .35; 914 | S = qtdecomp(source,range_value,2);%四叉树分割 915 | blocks = zeros(256); 916 | 917 | %产生分块边界 918 | for dim = [64 32 16 8 4 2] 919 | numblocks = length(find(S==dim)); 920 | if (numblocks > 0) 921 | values = repmat(uint8(1),[dim dim numblocks]); 922 | values(2:dim,2:dim,:) = 0; 923 | blocks = qtsetblk(blocks,S,dim,values); 924 | end 925 | end 926 | 927 | %产生分裂图 928 | output1 = source; 929 | output1(blocks==1) = 255; 930 | subplot(1,3,2); imshow(output1); title('分裂'); 931 | 932 | %将各块分别标记 933 | i = 0; 934 | for dim = [64 32 16 8 4 2] 935 | [vals,r,c] = qtgetblk(source,S,dim); 936 | if ~isempty(vals) 937 | for j = 1:length(r) 938 | i = i + 1; 939 | blocks(r(j):r(j)+ dim - 1,c(j):c(j)+ dim - 1) = i; 940 | end 941 | end 942 | end 943 | 944 | %将极差较小的块的标记合并 945 | for j = 1 : i 946 | bound = boundarymask(blocks==j,4) & (~(blocks==j)); 947 | [r,l] = find(bound==1); 948 | for k = 1 : size(r,1) 949 | merge = source((blocks==j) | (blocks==blocks(r(k),l(k)))); 950 | if(range(merge(:))= 1) && (y >= 1) 50 | pix_up_left=[floor(x) floor(y)]; 51 | pix_up_right=[floor(x) ceil(y)]; 52 | pix_down_left=[ceil(x) floor(y)]; 53 | pix_down_right=[ceil(x) ceil(y)]; 54 | value_up_left=(1-float_x)*(1-float_y); 55 | value_up_right=(1-float_x)*float_y; 56 | value_down_left=float_x*(1-float_y); 57 | value_down_right=float_x*float_y; 58 | output(i, j) = value_up_left*source(pix_up_left(1,2), pix_up_left(1,1), 1)+ ... 59 | value_up_right*source(pix_up_right(1,2), pix_up_right(1,1), 1)+ ... 60 | value_down_left*source(pix_down_left(1,2), pix_down_left(1,1), 1)+ ... 61 | value_down_right*source(pix_down_right(1,2), pix_down_right(1,1), 1); 62 | end 63 | end 64 | end 65 | 66 | close all; 67 | figure(); 68 | subplot(1, 2, 1); 69 | imshow(source); 70 | title("原始图像"); 71 | 72 | subplot(1, 2, 2); 73 | imshow(uint8(output)); 74 | title("修复图像"); 75 | 76 | -------------------------------------------------------------------------------- /实验/lab1(不用库函数)/alphabet1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab1(不用库函数)/alphabet1.jpg -------------------------------------------------------------------------------- /实验/lab1(不用库函数)/alphabet2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab1(不用库函数)/alphabet2.jpg -------------------------------------------------------------------------------- /实验/lab1(不用库函数)/debug.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab1(不用库函数)/debug.log -------------------------------------------------------------------------------- /实验/lab1(不用库函数)/lab1_1.m: -------------------------------------------------------------------------------- 1 | source = imread('1.jpg'); 2 | [r, c, l] = size(source); 3 | output = zeros(r, c, l); 4 | tx = 100; 5 | ty = 50; 6 | opmatrix = [1 0 tx; 0 1 ty; 0 0 1]; 7 | for i = 1 : r 8 | for j = 1 : c 9 | pixel = [i; j; 1]; 10 | pixel = opmatrix * pixel; 11 | x = pixel(1, 1); 12 | y = pixel(2, 1); 13 | if (x <= r) && (y <= c) && (x >= 1) && (y >= 1) 14 | for k = 1 : l 15 | output(x, y, k) = source(i, j, k); 16 | end 17 | end 18 | end 19 | end 20 | subplot(1,2,1); imshow(source); 21 | subplot(1,2,2); imshow(uint8(output)); -------------------------------------------------------------------------------- /实验/lab1(不用库函数)/lab1_2.m: -------------------------------------------------------------------------------- 1 | source = imread('1.bmp'); 2 | [r, c, l] = size(source); 3 | output1 = zeros(r, c, l); 4 | output2 = zeros(r, c, l); 5 | theta = 35 / 180.0 * pi ; 6 | a=r/2; 7 | b=c/2; 8 | opmatrix = [1 0 a; 0 1 b; 0 0 1]*[cos(theta) -sin(theta) 0; sin(theta) cos(theta) 0; 0 0 1]*[1 0 -a; 0 1 -b; 0 0 1]; 9 | for i = 1 : r 10 | for j = 1 : c 11 | pixel = [i; j; 1]; 12 | pixel = opmatrix \ pixel; 13 | x = round(pixel(1, 1)); 14 | y = round(pixel(2, 1)); 15 | if (x <= r) && (y <= c) && (x >= 1) && (y >= 1) 16 | for k = 1 : l 17 | output1(i, j, k) = source(x, y, k); 18 | end 19 | end 20 | end 21 | end 22 | for i = 1 : r 23 | for j = 1 : c 24 | pixel = [i; j; 1]; 25 | pixel = opmatrix \ pixel; 26 | x = pixel(1, 1); 27 | y = pixel(2, 1); 28 | float_x=x-floor(x); 29 | float_y=y-floor(y); 30 | if (x <= r) && (y <= c) && (x >= 1) && (y >= 1) 31 | pix_up_left=[floor(x) floor(y)]; 32 | pix_up_right=[floor(x) ceil(y)]; 33 | pix_down_left=[ceil(x) floor(y)]; 34 | pix_down_right=[ceil(x) ceil(y)]; 35 | value_up_left=(1-float_x)*(1-float_y); 36 | value_up_right=(1-float_x)*float_y; 37 | value_down_left=float_x*(1-float_y); 38 | value_down_right=float_x*float_y; 39 | for k = 1 : l 40 | output2(i, j, k) = value_up_left*source(pix_up_left(1,1), pix_up_left(1,2), k)+ ... 41 | value_up_right*source(pix_up_right(1,1), pix_up_right(1,2), k)+ ... 42 | value_down_left*source(pix_down_left(1,1), pix_down_left(1,2), k)+ ... 43 | value_down_right*source(pix_down_right(1,1), pix_down_right(1,2), k); 44 | end 45 | end 46 | end 47 | end 48 | subplot(1,2,1); imshow(uint8(output1)); 49 | subplot(1,2,2); imshow(uint8(output2)); 50 | 51 | -------------------------------------------------------------------------------- /实验/lab1(不用库函数)/lab1_3.m: -------------------------------------------------------------------------------- 1 | source = imread('1.bmp'); 2 | [r, c, l] = size(source); 3 | C = 0.7; 4 | D = 2; 5 | newc = round(c*C); 6 | newr = round(r*D); 7 | output1 = zeros(newr, newc, l); 8 | output2 = zeros(newr, newc, l); 9 | opmatrix = [C 0 0; 0 D 0; 0 0 1]; 10 | for i = 1 : newc 11 | for j = 1 : newr 12 | pixel = [i; j; 1]; 13 | pixel = opmatrix \ pixel; 14 | x = round(pixel(1, 1)); 15 | y = round(pixel(2, 1)); 16 | if (x <= c) && (y <= r) && (x >= 1) && (y >= 1) 17 | for k = 1 : l 18 | output1(j, i, k) = source(y, x, k); 19 | end 20 | end 21 | end 22 | end 23 | for i = 1 : newc 24 | for j = 1 : newr 25 | pixel = [i; j; 1]; 26 | pixel = opmatrix \ pixel; 27 | x = pixel(1, 1); 28 | y = pixel(2, 1); 29 | float_x=x-floor(x); 30 | float_y=y-floor(y); 31 | if (x <= c) && (y <= r) && (x >= 1) && (y >= 1) 32 | pix_up_left=[floor(x) floor(y)]; 33 | pix_up_right=[floor(x) ceil(y)]; 34 | pix_down_left=[ceil(x) floor(y)]; 35 | pix_down_right=[ceil(x) ceil(y)]; 36 | value_up_left=(1-float_x)*(1-float_y); 37 | value_up_right=(1-float_x)*float_y; 38 | value_down_left=float_x*(1-float_y); 39 | value_down_right=float_x*float_y; 40 | for k = 1 : l 41 | output2(j, i, k) = value_up_left*source(pix_up_left(1,2), pix_up_left(1,1), k)+ ... 42 | value_up_right*source(pix_up_right(1,2), pix_up_right(1,1), k)+ ... 43 | value_down_left*source(pix_down_left(1,2), pix_down_left(1,1), k)+ ... 44 | value_down_right*source(pix_down_right(1,2), pix_down_right(1,1), k); 45 | end 46 | end 47 | end 48 | end 49 | subplot(1,2,1); imshow(uint8(output1)); 50 | subplot(1,2,2); imshow(uint8(output2)); 51 | 52 | -------------------------------------------------------------------------------- /实验/lab1(不用库函数)/lab1_4.m: -------------------------------------------------------------------------------- 1 | source = imread('alphabet2.jpg'); 2 | [r, c, l] = size(source); 3 | output1 = zeros(224, 224, l); 4 | output2 = zeros(224, 224, l); 5 | x1=1; 6 | y1=1; 7 | u1=1; 8 | v1=1; 9 | x2=224; 10 | y2=1; 11 | u2=224; 12 | v2=1; 13 | x3=1; 14 | y3=224; 15 | u3=1; 16 | v3=224; 17 | x4=245; 18 | y4=266; 19 | u4=224; 20 | v4=224; 21 | A=[x1 y1 1 0 0 0 -x1*u1 -y1*u1; 22 | 0 0 0 x1 y1 1 -x1*v1 -y1*v1; 23 | x2 y2 1 0 0 0 -x2*u2 -y2*u2; 24 | 0 0 0 x2 y2 1 -x2*v2 -y2*v2; 25 | x3 y3 1 0 0 0 -x3*u3 -y3*u3; 26 | 0 0 0 x3 y3 1 -x3*v3 -y3*v3; 27 | x4 y4 1 0 0 0 -x4*u4 -y4*u4; 28 | 0 0 0 x4 y4 1 -x4*v4 -y4*v4]; 29 | B=[u1;v1;u2;v2;u3;v3;u4;v4]; 30 | M=A\B; 31 | opmatrix = [M(1,1) M(2,1) M(3,1); M(4,1) M(5,1) M(6,1); M(7,1) M(8,1) 1]; 32 | invopmatrix = inv(opmatrix); 33 | for i = 1 : 224 34 | for j = 1 : 224 35 | w = 1/(invopmatrix(3,1)*j+invopmatrix(3,2)*i+1); 36 | pixel = [w*j; w*i; w]; 37 | pixel = opmatrix \ pixel; 38 | x = round(pixel(1, 1)); 39 | y = round(pixel(2, 1)); 40 | if (x <= c) && (y <= r) && (x >= 1) && (y >= 1) 41 | for k = 1 : l 42 | output1(i, j, k) = source(y, x, k); 43 | end 44 | end 45 | end 46 | end 47 | for i = 1 : 224 48 | for j = 1 : 224 49 | w = 1/(invopmatrix(3,1)*j+invopmatrix(3,2)*i+1); 50 | pixel = [w*j; w*i; w]; 51 | pixel = opmatrix \ pixel; 52 | x = pixel(1, 1); 53 | y = pixel(2, 1); 54 | float_x=x-floor(x); 55 | float_y=y-floor(y); 56 | if (x <= c) && (y <= r) && (x >= 1) && (y >= 1) 57 | pix_up_left=[floor(x) floor(y)]; 58 | pix_up_right=[floor(x) ceil(y)]; 59 | pix_down_left=[ceil(x) floor(y)]; 60 | pix_down_right=[ceil(x) ceil(y)]; 61 | value_up_left=(1-float_x)*(1-float_y); 62 | value_up_right=(1-float_x)*float_y; 63 | value_down_left=float_x*(1-float_y); 64 | value_down_right=float_x*float_y; 65 | for k = 1 : l 66 | output2(i, j, k) = value_up_left*source(pix_up_left(1,2), pix_up_left(1,1), k)+ ... 67 | value_up_right*source(pix_up_right(1,2), pix_up_right(1,1), k)+ ... 68 | value_down_left*source(pix_down_left(1,2), pix_down_left(1,1), k)+ ... 69 | value_down_right*source(pix_down_right(1,2), pix_down_right(1,1), k); 70 | end 71 | end 72 | end 73 | end 74 | output2(1,:,:)=[]; 75 | output2(:,1,:)=[]; 76 | subplot(1,2,1); imshow(uint8(output1)); 77 | subplot(1,2,2); imshow(uint8(output2)); -------------------------------------------------------------------------------- /实验/lab1(不用库函数)/lena.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab1(不用库函数)/lena.bmp -------------------------------------------------------------------------------- /实验/lab1/alphabet1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab1/alphabet1.jpg -------------------------------------------------------------------------------- /实验/lab1/alphabet2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab1/alphabet2.jpg -------------------------------------------------------------------------------- /实验/lab1/lab1_1.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | tx = input("水平平移量:"); 3 | ty = input("垂直平移量:"); 4 | output = imtranslate(source,[tx,ty]); 5 | subplot(1,2,1); imshow(source); title('原图'); 6 | subplot(1,2,2); imshow(output); title('平移后'); -------------------------------------------------------------------------------- /实验/lab1/lab1_2.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | angle = input("旋转角度:"); 3 | output1 = imrotate(source,angle,'nearest','crop');%nearest为最近邻插值 4 | output2 = imrotate(source,angle,'bilinear','crop');%bilinear为双线性插值 5 | subplot(1,2,1); imshow(output1);title('最近邻插值'); 6 | subplot(1,2,2); imshow(output2);title('双线性插值'); -------------------------------------------------------------------------------- /实验/lab1/lab1_3.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | [r,l] = size(source); 3 | x = input("水平缩放量:"); 4 | y = input("垂直缩放量:"); 5 | output1 = imresize(source,[r*y,l*x],'nearest');%nearest为最近邻插值 6 | output2 = imresize(source,[r*y,l*x],'bilinear');%bilinear为双线性插值 7 | subplot(1,2,1); imshow(output1);title('最近邻插值'); 8 | subplot(1,2,2); imshow(output2);title('双线性插值'); -------------------------------------------------------------------------------- /实验/lab1/lab1_4.m: -------------------------------------------------------------------------------- 1 | source = imread('alphabet2.jpg'); 2 | origin = imread('alphabet1.jpg'); 3 | subplot(1,2,1); imshow(source); 4 | subplot(1,2,2); imshow(origin); 5 | [x, y] = ginput(8);%获得几何失真图像与原图一一对应的四组控制点对 6 | movingPoints = [x(1) y(1);x(3) y(3);x(5) y(5);x(7) y(7)];%几何失真图像控制点 7 | fixedPoints = [x(2) y(2);x(4) y(4);x(6) y(6);x(8) y(8)];%原图控制点 8 | tform = fitgeotrans(movingPoints,fixedPoints,'projective');%对几何变换拟合 9 | output1 = imwarp(source,tform,'nearest');%nearest为最近邻插值 10 | output2 = imwarp(source,tform,'bilinear');%bilinear为双线性插值 11 | subplot(1,2,1); imshow(output1);title('最近邻插值'); 12 | subplot(1,2,2); imshow(output2);title('双线性插值'); -------------------------------------------------------------------------------- /实验/lab1/lena.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab1/lena.bmp -------------------------------------------------------------------------------- /实验/lab2/lab2_1.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | [r,l] = size(source); 3 | output = zeros(r,l); 4 | fa = input("斜率:"); 5 | fb = input("截距:"); 6 | for i = 1 : r 7 | for j = 1 : l 8 | output(i,j) = source(i,j)*fa+fb;%进行线性映射 9 | end 10 | end 11 | subplot(1,2,1); imshow(source); title('原图'); 12 | subplot(1,2,2); imshow(uint8(output)); title('线性变换后'); -------------------------------------------------------------------------------- /实验/lab2/lab2_2.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | [r,l] = size(source); 3 | output = zeros(r,l); 4 | x1 = input("x1:"); 5 | y1 = input("y1:"); 6 | x2 = input("x2:"); 7 | y2 = input("y2:"); 8 | for i = 1 : r 9 | for j = 1 : l 10 | output(i,j) = f(source(i,j),x1,y1,x2,y2);%进行线性映射 11 | end 12 | end 13 | subplot(1,2,1); imshow(source); title('原图'); 14 | subplot(1,2,2); imshow(uint8(output)); title('灰度拉伸后'); 15 | 16 | function [fx] = f(x,x1,y1,x2,y2)%灰度拉伸函数 17 | if(x < x1) 18 | fx = y1 / x1 * x; 19 | else 20 | if(x <= x2) 21 | fx = (y2 - y1)/(x2 - x1)*(x - x1) + y1; 22 | else 23 | fx = (255 - y2)/(255 - x2)*(x - x2) + y2; 24 | end 25 | end 26 | end -------------------------------------------------------------------------------- /实验/lab2/lab2_3.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | min = input("下限:"); 3 | max = input("上限:"); 4 | histogram(source,'BinLimits',[min,max])%显示给定范围的灰度直方图 -------------------------------------------------------------------------------- /实验/lab2/lab2_4.m: -------------------------------------------------------------------------------- 1 | source = imread('pout.bmp'); 2 | subplot(3,2,1); imshow(source); title('原图'); 3 | subplot(3,2,2); histogram(source);title('原图直方图'); 4 | output1 = histeq(source);%直方图均衡 5 | subplot(3,2,3); imshow(output1);title('直方图均衡'); 6 | subplot(3,2,4); histogram(output1);title('增强后直方图'); 7 | output2 = histeq(source,normpdf((0:1:255),127,40));%使用均值127,标准差40的高斯函数进行规定化 8 | subplot(3,2,5); imshow(output2);title('直方图规定化'); 9 | subplot(3,2,6); histogram(output2);title('规定化后直方图'); -------------------------------------------------------------------------------- /实验/lab2/lena.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab2/lena.bmp -------------------------------------------------------------------------------- /实验/lab2/pout.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab2/pout.bmp -------------------------------------------------------------------------------- /实验/lab3/blood.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab3/blood.bmp -------------------------------------------------------------------------------- /实验/lab3/lab3_1.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | %添加噪声 3 | pepper = imnoise(source,'salt & pepper',0.03); 4 | gaussian = imnoise(source,'gaussian'); 5 | random = Random(source); 6 | %均值滤波 7 | pepper_output = imfilter(pepper,fspecial('average',3)); 8 | gaussian_output = imfilter(gaussian,fspecial('average',3)); 9 | poisson_output = imfilter(random,fspecial('average',3)); 10 | subplot(2,4,1); imshow(source); title('原图'); 11 | subplot(2,4,2); imshow(pepper); title('3%椒盐噪声'); 12 | subplot(2,4,3); imshow(gaussian); title('高斯噪声'); 13 | subplot(2,4,4); imshow(random); title('随机噪声'); 14 | subplot(2,4,6); imshow(pepper_output); title('3%椒盐噪声均值滤波'); 15 | subplot(2,4,7); imshow(gaussian_output); title('高斯噪声均值滤波'); 16 | subplot(2,4,8); imshow(poisson_output); title('随机噪声均值滤波'); 17 | 18 | %随机噪声 19 | function [output] = Random(input) 20 | output = imnoise(input,'salt & pepper',0.03); 21 | [r,l] = size(output); 22 | for i = 1 : r 23 | for j = 1 : l 24 | if(output(i,j) ~= input(i,j)) 25 | output(i,j) = uint8(rand()*255); 26 | end 27 | end 28 | end 29 | end -------------------------------------------------------------------------------- /实验/lab3/lab3_2.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | %添加噪声 3 | pepper = imnoise(source,'salt & pepper',0.03); 4 | gaussian = imnoise(source,'gaussian'); 5 | random = Random(source); 6 | %超限邻域平均滤波 7 | pepper_output = filter(pepper,35); 8 | gaussian_output = filter(gaussian,35); 9 | poisson_output = filter(random,35); 10 | subplot(2,4,1); imshow(source); title('原图'); 11 | subplot(2,4,2); imshow(pepper); title('3%椒盐噪声'); 12 | subplot(2,4,3); imshow(gaussian); title('高斯噪声'); 13 | subplot(2,4,4); imshow(random); title('随机噪声'); 14 | subplot(2,4,6); imshow(pepper_output); title('3%椒盐噪声超限邻域平均滤波'); 15 | subplot(2,4,7); imshow(gaussian_output); title('高斯噪声超限邻域平均滤波'); 16 | subplot(2,4,8); imshow(poisson_output); title('随机噪声超限邻域平均滤波'); 17 | 18 | function [output] = filter(input,T) 19 | output = input; 20 | [r,l] = size(output); 21 | for i = 2 : (r - 1) 22 | for j = 2 : (l - 1) 23 | mean_value = mean(mean(input(i - 1 : i + 1, j - 1 : j + 1)));%计算均值 24 | if(abs(double(input(i,j)) - mean_value) > T)%超限滤波 25 | output(i,j) = mean_value; 26 | end 27 | end 28 | end 29 | end 30 | 31 | %随机噪声 32 | function [output] = Random(input) 33 | output = imnoise(input,'salt & pepper',0.03); 34 | [r,l] = size(output); 35 | for i = 1 : r 36 | for j = 1 : l 37 | if(output(i,j) ~= input(i,j)) 38 | output(i,j) = uint8(rand()*255); 39 | end 40 | end 41 | end 42 | end -------------------------------------------------------------------------------- /实验/lab3/lab3_3.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | %添加噪声 3 | pepper = imnoise(source,'salt & pepper',0.03); 4 | gaussian = imnoise(source,'gaussian'); 5 | random = Random(source); 6 | %中值滤波 7 | pepper_output = medfilt2(pepper); 8 | gaussian_output = medfilt2(gaussian); 9 | speckle_output = medfilt2(random); 10 | subplot(2,4,1); imshow(source); title('原图'); 11 | subplot(2,4,2); imshow(pepper); title('3%椒盐噪声'); 12 | subplot(2,4,3); imshow(gaussian); title('高斯噪声'); 13 | subplot(2,4,4); imshow(random); title('随机噪声'); 14 | subplot(2,4,6); imshow(pepper_output); title('3%椒盐噪声中值滤波'); 15 | subplot(2,4,7); imshow(gaussian_output); title('高斯噪声中值滤波'); 16 | subplot(2,4,8); imshow(speckle_output); title('随机噪声中值滤波'); 17 | 18 | %随机噪声 19 | function [output] = Random(input) 20 | output = imnoise(input,'salt & pepper',0.03); 21 | [r,l] = size(output); 22 | for i = 1 : r 23 | for j = 1 : l 24 | if(output(i,j) ~= input(i,j)) 25 | output(i,j) = uint8(rand()*255); 26 | end 27 | end 28 | end 29 | end -------------------------------------------------------------------------------- /实验/lab3/lab3_4.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | %添加噪声 3 | pepper = imnoise(source,'salt & pepper',0.03); 4 | gaussian = imnoise(source,'gaussian'); 5 | random = Random(source); 6 | %超限中值滤波 7 | pepper_output = filter(pepper,35); 8 | gaussian_output = filter(gaussian,35); 9 | speckle_output = filter(random,35); 10 | subplot(2,4,1); imshow(source); title('原图'); 11 | subplot(2,4,2); imshow(pepper); title('3%椒盐噪声'); 12 | subplot(2,4,3); imshow(gaussian); title('高斯噪声'); 13 | subplot(2,4,4); imshow(random); title('随机噪声'); 14 | subplot(2,4,6); imshow(pepper_output); title('3%椒盐噪声超限中值滤波'); 15 | subplot(2,4,7); imshow(gaussian_output); title('高斯噪声超限中值滤波'); 16 | subplot(2,4,8); imshow(speckle_output); title('随机噪声超限中值滤波'); 17 | 18 | %随机噪声 19 | function [output] = filter(input,T) 20 | output = input; 21 | [r,l] = size(output); 22 | for i = 2 : (r - 1) 23 | for j = 2 : (l - 1) 24 | temp = input(i - 1 : i + 1, j - 1 : j + 1); 25 | middle_value = median(temp(:)); 26 | if(abs(double(input(i,j)) - double(middle_value)) > T) 27 | output(i,j) = middle_value; 28 | end 29 | end 30 | end 31 | end 32 | 33 | function [output] = Random(input) 34 | output = imnoise(input,'salt & pepper',0.03); 35 | [r,l] = size(output); 36 | for i = 1 : r 37 | for j = 1 : l 38 | if(output(i,j) ~= input(i,j)) 39 | output(i,j) = uint8(rand()*255); 40 | end 41 | end 42 | end 43 | end -------------------------------------------------------------------------------- /实验/lab3/lab3_6_1.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | %Roberts算子 3 | Roberts = edge(source,'Roberts'); 4 | %Sobel算子 5 | Sobel = edge(source,'Sobel'); 6 | %Prewitt算子 7 | Prewitt = edge(source,'Prewitt'); 8 | %拉普拉斯算子 9 | Laplacian1 = imfilter(source,fspecial('laplacian',0)); 10 | Laplacian2 = imfilter(source,[-1 -1 -1; -1 8 -1; -1 -1 -1]); 11 | %Canny算子 12 | Canny = edge(source,'Canny'); 13 | 14 | subplot(3,3,[1,3]); imshow(source); title('原图'); 15 | subplot(3,3,4); imshow(Roberts); title('Roberts'); 16 | subplot(3,3,5); imshow(Sobel); title('Sobel'); 17 | subplot(3,3,6); imshow(Prewitt); title('Prewitt'); 18 | subplot(3,3,7); imshow(Laplacian1); title('Laplacian1'); 19 | subplot(3,3,8); imshow(Laplacian2); title('Laplacian2'); 20 | subplot(3,3,9); imshow(Canny); title('Canny'); 21 | -------------------------------------------------------------------------------- /实验/lab3/lab3_6_2.m: -------------------------------------------------------------------------------- 1 | source = imread('blood.bmp'); 2 | %Roberts算子 3 | Roberts = edge(source,'Roberts'); 4 | %Sobel算子 5 | Sobel = edge(source,'Sobel'); 6 | %Prewitt算子 7 | Prewitt = edge(source,'Prewitt'); 8 | %拉普拉斯算子 9 | Laplacian1 = imfilter(source,-fspecial('laplacian',0)); 10 | Laplacian2 = imfilter(source,[-1 -1 -1; -1 8 -1; -1 -1 -1]); 11 | %Canny算子 12 | Canny = edge(source,'Canny'); 13 | 14 | subplot(3,3,[1,3]); imshow(source); title('原图'); 15 | subplot(3,3,4); imshow(Roberts); title('Roberts'); 16 | subplot(3,3,5); imshow(Sobel); title('Sobel'); 17 | subplot(3,3,6); imshow(Prewitt); title('Prewitt'); 18 | subplot(3,3,7); imshow(Laplacian1); title('Laplacian1'); 19 | subplot(3,3,8); imshow(Laplacian2); title('Laplacian2'); 20 | subplot(3,3,9); imshow(Canny); title('Canny'); 21 | -------------------------------------------------------------------------------- /实验/lab3/lena.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab3/lena.bmp -------------------------------------------------------------------------------- /实验/lab4/Girl.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab4/Girl.bmp -------------------------------------------------------------------------------- /实验/lab4/Rect1.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab4/Rect1.bmp -------------------------------------------------------------------------------- /实验/lab4/Rect2.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab4/Rect2.bmp -------------------------------------------------------------------------------- /实验/lab4/alphabet1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab4/alphabet1.jpg -------------------------------------------------------------------------------- /实验/lab4/lab4_1.m: -------------------------------------------------------------------------------- 1 | source1 = imread('Rect1.bmp'); 2 | source2 = imread('Rect2.bmp'); 3 | %傅里叶变换 4 | F1 = fft2(source1); 5 | F2 = fft2(source2); 6 | %移动低频至中心并增强 7 | F1_shift = log(abs(fftshift(F1))+1); 8 | F2_shift = log(abs(fftshift(F2))+1); 9 | %幅度逆变换 10 | IF1_abs = uint8(ifft2(abs(F1))); 11 | IF2_abs = uint8(ifft2(abs(F2))); 12 | %相位逆变换 13 | IF1_angle = uint8(abs(ifft2(10000*exp(1i*angle(F1))))); 14 | IF2_angle = uint8(abs(ifft2(10000*exp(1i*angle(F2))))); 15 | %共轭逆变换 16 | IF1_conj = ifft2(conj(F1)); 17 | IF2_conj = ifft2(conj(F2)); 18 | subplot(2,5,1); imshow(source1); title('rect1'); 19 | subplot(2,5,2); imshow(F1_shift,[]); title('rect1幅度谱'); 20 | subplot(2,5,3); imshow(IF1_abs); title('rect1幅度逆变换'); 21 | subplot(2,5,4); imshow(IF1_angle); title('rect1相位逆变换'); 22 | subplot(2,5,5); imshow(IF1_conj,[]); title('rect1傅里叶变换共轭逆变换'); 23 | subplot(2,5,6); imshow(source2); title('rect2'); 24 | subplot(2,5,7); imshow(F2_shift,[]); title('rect2幅度谱'); 25 | subplot(2,5,8); imshow(IF2_abs); title('rect2幅度逆变换'); 26 | subplot(2,5,9); imshow(IF2_angle); title('rect2相位逆变换'); 27 | subplot(2,5,10); imshow(IF2_conj,[]); title('rect2傅里叶变换共轭逆变换'); 28 | -------------------------------------------------------------------------------- /实验/lab4/lab4_2.m: -------------------------------------------------------------------------------- 1 | source1 = imread('Pout.bmp'); 2 | source2 = imread('Girl.bmp'); 3 | D = 35; 4 | subplot(2,4,1); imshow(source1,[]); title('Pout'); 5 | subplot(2,4,2); imshow(ILPF(source1,D),[]); title('Pout理想低通滤波器'); 6 | subplot(2,4,3); imshow(BLPF(source1,D,1),[]); title('Pout巴特沃斯低通滤波器'); 7 | subplot(2,4,4); imshow(ELPF(source1,D,2),[]); title('Pout高斯低通滤波器'); 8 | subplot(2,4,5); imshow(source2); title('Girl'); 9 | subplot(2,4,6); imshow(ILPF(source2,D),[]); title('Girl理想低通滤波器'); 10 | subplot(2,4,7); imshow(BLPF(source2,D,1),[]); title('Girl巴特沃斯低通滤波器'); 11 | subplot(2,4,8); imshow(ELPF(source2,D,2),[]); title('Girl高斯低通滤波器'); 12 | 13 | %理想低通滤波器 14 | function output = ILPF(input,D0) 15 | [r,l] = size(input); 16 | F = fftshift(fft2(input));%傅里叶变换并平移 17 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 18 | D = hypot(U,V);%计算中心偏移距离 19 | H = D <= D0 ; 20 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 21 | end 22 | 23 | %巴特沃斯低通滤波器 24 | function output = BLPF(input,D0,n) 25 | [r,l] = size(input); 26 | F = fftshift(fft2(input));%傅里叶变换并平移 27 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 28 | D = hypot(U,V);%计算中心偏移距离 29 | H = 1./(1+((D./D0).^(2*n))); 30 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 31 | end 32 | 33 | %高斯低通滤波器 34 | function output = ELPF(input,D0,n) 35 | [r,l] = size(input); 36 | F = fftshift(fft2(input));%傅里叶变换并平移 37 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 38 | D = hypot(U,V);%计算中心偏移距离 39 | H = exp(-(D./D0).^n); 40 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 41 | end 42 | 43 | -------------------------------------------------------------------------------- /实验/lab4/lab4_3.m: -------------------------------------------------------------------------------- 1 | source1 = imread('Pout.bmp'); 2 | source2 = imread('Girl.bmp'); 3 | %添加噪声 4 | source1_pepper = imnoise(source1,'salt & pepper',0.03); 5 | source1_gaussian = imnoise(source1,'gaussian'); 6 | source2_pepper = imnoise(source2,'salt & pepper',0.03); 7 | source2_gaussian = imnoise(source2,'gaussian'); 8 | 9 | figure(); 10 | subplot(3,3,1); imshow(source1,[]); title('Pout'); 11 | subplot(3,3,2); imshow(source1_pepper,[]); title('Pout-椒盐噪声'); 12 | subplot(3,3,3); imshow(source1_gaussian,[]); title('Pout-高斯噪声'); 13 | subplot(3,3,4); imshow(ILPF(source1_pepper,35),[]); title('Pout-椒盐噪声理想低通滤波器'); 14 | subplot(3,3,5); imshow(BLPF(source1_pepper,35,1),[]); title('Pout-椒盐噪声巴特沃斯低通滤波器'); 15 | subplot(3,3,6); imshow(ELPF(source1_pepper,35,2),[]); title('Pout-椒盐噪声高斯低通滤波器'); 16 | subplot(3,3,7); imshow(ILPF(source1_gaussian,35),[]); title('Pout-高斯噪声理想低通滤波器'); 17 | subplot(3,3,8); imshow(BLPF(source1_gaussian,35,1),[]); title('Pout-高斯噪声巴特沃斯低通滤波器'); 18 | subplot(3,3,9); imshow(ELPF(source1_gaussian,35,2),[]); title('Pout-高斯噪声高斯低通滤波器'); 19 | 20 | figure(); 21 | subplot(3,3,1); imshow(source2,[]); title('Girl'); 22 | subplot(3,3,2); imshow(source2_pepper,[]); title('Girl-椒盐噪声'); 23 | subplot(3,3,3); imshow(source2_gaussian,[]); title('Girl-高斯噪声'); 24 | subplot(3,3,4); imshow(ILPF(source2_pepper,35),[]); title('Girl-椒盐噪声理想低通滤波器'); 25 | subplot(3,3,5); imshow(BLPF(source2_pepper,35,1),[]); title('Girl-椒盐噪声巴特沃斯低通滤波器'); 26 | subplot(3,3,6); imshow(ELPF(source2_pepper,35,1),[]); title('Girl-椒盐噪声高斯低通滤波器'); 27 | subplot(3,3,7); imshow(ILPF(source2_gaussian,35),[]); title('Girl-高斯噪声理想低通滤波器'); 28 | subplot(3,3,8); imshow(BLPF(source2_gaussian,35,1),[]); title('Girl-高斯噪声巴特沃斯低通滤波器'); 29 | subplot(3,3,9); imshow(ELPF(source2_gaussian,35,1),[]); title('Girl-高斯噪声高斯低通滤波器'); 30 | 31 | %理想低通滤波器 32 | function output = ILPF(input,D0) 33 | [r,l] = size(input); 34 | F = fftshift(fft2(input));%傅里叶变换并平移 35 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 36 | D = hypot(U,V);%计算中心偏移距离 37 | H = D <= D0 ; 38 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 39 | end 40 | 41 | %巴特沃斯低通滤波器 42 | function output = BLPF(input,D0,n) 43 | [r,l] = size(input); 44 | F = fftshift(fft2(input));%傅里叶变换并平移 45 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 46 | D = hypot(U,V);%计算中心偏移距离 47 | H = 1./(1+((D./D0).^(2*n))); 48 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 49 | end 50 | 51 | %高斯低通滤波器 52 | function output = ELPF(input,D0,n) 53 | [r,l] = size(input); 54 | F = fftshift(fft2(input));%傅里叶变换并平移 55 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 56 | D = hypot(U,V);%计算中心偏移距离 57 | H = exp(-(D./D0).^n); 58 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 59 | end 60 | -------------------------------------------------------------------------------- /实验/lab4/lab4_4.m: -------------------------------------------------------------------------------- 1 | source1 = imread('Pout.bmp'); 2 | source2 = imread('Girl.bmp'); 3 | D = 15; 4 | subplot(2,4,1); imshow(source1,[]); title('Pout'); 5 | subplot(2,4,2); imshow(ILPF(source1,D),[]); title('Pout理想高通滤波器'); 6 | subplot(2,4,3); imshow(BLPF(source1,D,1),[]); title('Pout巴特沃斯高通滤波器'); 7 | subplot(2,4,4); imshow(ELPF(source1,D,2),[]); title('Pout高斯高通滤波器'); 8 | subplot(2,4,5); imshow(source2); title('Girl'); 9 | subplot(2,4,6); imshow(ILPF(source2,D),[]); title('Girl理想高通滤波器'); 10 | subplot(2,4,7); imshow(BLPF(source2,D,1),[]); title('Girl巴特沃斯高通滤波器'); 11 | subplot(2,4,8); imshow(ELPF(source2,D,2),[]); title('Girl高斯高通滤波器'); 12 | 13 | %理想高通滤波器 14 | function output = ILPF(input,D0) 15 | [r,l] = size(input); 16 | F = fftshift(fft2(input));%傅里叶变换并平移 17 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 18 | D = hypot(U,V);%计算中心偏移距离 19 | H = D > D0 ; 20 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 21 | end 22 | 23 | %巴特沃斯高通滤波器 24 | function output = BLPF(input,D0,n) 25 | [r,l] = size(input); 26 | F = fftshift(fft2(input));%傅里叶变换并平移 27 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 28 | D = hypot(U,V);%计算中心偏移距离 29 | H = 1./(1+((D0./D).^(2*n))); 30 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 31 | end 32 | 33 | %高斯高通滤波器 34 | function output = ELPF(input,D0,n) 35 | [r,l] = size(input); 36 | F = fftshift(fft2(input));%傅里叶变换并平移 37 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 38 | D = hypot(U,V);%计算中心偏移距离 39 | H = exp(-(D0./D).^n); 40 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 41 | end 42 | 43 | -------------------------------------------------------------------------------- /实验/lab4/lab4_5.m: -------------------------------------------------------------------------------- 1 | source = imread('Pout.bmp'); 2 | D = 15; 3 | n = 1; 4 | a = 4; 5 | b = 1; 6 | subplot(2,4,1); imshow(source,[]); title('Pout'); 7 | subplot(2,4,2); imshow(histeq(uint8(ILPF(source,D,a,b)))); title('Pout理想高频-直方图'); 8 | subplot(2,4,3); imshow(histeq(uint8(BLPF(source,D,n,a,b)))); title('Pout巴特沃斯高频-直方图'); 9 | subplot(2,4,4); imshow(histeq(uint8(ELPF(source,D,n,a,b)))); title('Pout高斯高频-直方图'); 10 | subplot(2,4,6); imshow(ILPF(histeq(source),D,a,b),[]); title('Pout直方图-理想高频'); 11 | subplot(2,4,7); imshow(BLPF(histeq(source),D,n,a,b),[]); title('Pout直方图-巴特沃斯高频'); 12 | subplot(2,4,8); imshow(ELPF(histeq(source),D,n,a,b),[]); title('Pout直方图-高斯高频'); 13 | 14 | %理想高频滤波器 15 | function output = ILPF(input,D0,a,b) 16 | [r,l] = size(input); 17 | F = fftshift(fft2(input));%傅里叶变换并平移 18 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 19 | D = hypot(U,V);%计算中心偏移距离 20 | H = D > D0 ; 21 | H = a * H + b; 22 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 23 | end 24 | 25 | %巴特沃斯高频滤波器 26 | function output = BLPF(input,D0,n,a,b) 27 | [r,l] = size(input); 28 | F = fftshift(fft2(input));%傅里叶变换并平移 29 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 30 | D = hypot(U,V);%计算中心偏移距离 31 | H = 1./(1+((D0./D).^(2*n))); 32 | H = a * H + b; 33 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 34 | end 35 | 36 | %高斯高频滤波器 37 | function output = ELPF(input,D0,n,a,b) 38 | [r,l] = size(input); 39 | F = fftshift(fft2(input));%傅里叶变换并平移 40 | [U,V] = meshgrid(-l/2:l/2-1,-r/2:r/2-1);%构建坐标 41 | D = hypot(U,V);%计算中心偏移距离 42 | H = exp((-D0./D).^n); 43 | H = a * H + b; 44 | output = abs(ifft2(ifftshift(F.*H)));%卷积逆变换 45 | end 46 | 47 | -------------------------------------------------------------------------------- /实验/lab4/pout.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab4/pout.bmp -------------------------------------------------------------------------------- /实验/lab5/cameraman.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab5/cameraman.bmp -------------------------------------------------------------------------------- /实验/lab5/flower1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab5/flower1.jpg -------------------------------------------------------------------------------- /实验/lab5/flower2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyjwpk/USTC_2022_Digital-Image-Processing-and-Analysis/b10c822e002ef3ce7afa9d441bc9c184116a91f7/实验/lab5/flower2.jpg -------------------------------------------------------------------------------- /实验/lab5/lab5_1.m: -------------------------------------------------------------------------------- 1 | source = im2double(imread('flower1.jpg')); 2 | psf = fspecial('motion',30,45);%运动模糊滤波器 3 | motion = imfilter(source,psf,'conv','circular');%产生运动模糊 4 | noisy = imnoise(motion,'gauss',0,0.0001);%产生高斯噪声 5 | 6 | subplot(2,4,1); imshow(source); title('flower1'); 7 | subplot(2,4,2); imshow(motion); title('flower1运动模糊'); 8 | subplot(2,4,3); imshow(deconvwnr(motion,psf)); title('flower1运动模糊逆滤波'); 9 | subplot(2,4,4); imshow(deconvwnr(motion,psf)); title('flower1运动模糊维纳滤波'); 10 | subplot(2,4,6); imshow(noisy); title('flower1运动模糊&高斯噪声'); 11 | subplot(2,4,7); imshow(deconvwnr(noisy,psf)); title('flower1运动模糊&高斯噪声逆滤波'); 12 | subplot(2,4,8); imshow(deconvwnr(noisy,psf,0.0001/var(motion(:)))); title('flower1运动模糊&高斯噪声维纳滤波'); -------------------------------------------------------------------------------- /实验/lab5/lab5_2.m: -------------------------------------------------------------------------------- 1 | source = imread('lena.bmp'); 2 | subplot(1,3,1); imshow(source); title('lena'); 3 | subplot(1,3,2); imshow(imbinarize(source, OSTU(source))); title('分割二值化结果'); 4 | subplot(1,3,3); imshow(imbinarize(source, graythresh(source))); title('分割二值化结果'); 5 | 6 | function T = OSTU(input) 7 | [r, l] = size(input); 8 | N = r * l;%获得像素点数 9 | miu = zeros(257);%均值累计矩阵 10 | w = zeros(257);%概率累计矩阵 11 | for i = 0 : 255 12 | p = length(find(input == i)) / N;%像素为i的像素所占比例 13 | miu(i+2) = miu(i+1) + p * i; 14 | w(i+2) = w(i+1) + p; 15 | end 16 | g = (w./(1-w)).*(miu./w-miu(257)).^2; 17 | T = (find(g==max(g))- 2)/255; 18 | end -------------------------------------------------------------------------------- /实验/lab5/lab5_3.m: -------------------------------------------------------------------------------- 1 | source = imread('cameraman.bmp'); 2 | subplot(1,3,1); imshow(source); title('原图'); 3 | range_value = .35; 4 | S = qtdecomp(source,range_value,2);%四叉树分割 5 | blocks = zeros(256); 6 | 7 | %产生分块边界 8 | for dim = [64 32 16 8 4 2] 9 | numblocks = length(find(S==dim)); 10 | if (numblocks > 0) 11 | values = repmat(uint8(1),[dim dim numblocks]); 12 | values(2:dim,2:dim,:) = 0; 13 | blocks = qtsetblk(blocks,S,dim,values); 14 | end 15 | end 16 | 17 | %产生分裂图 18 | output1 = source; 19 | output1(blocks==1) = 255; 20 | subplot(1,3,2); imshow(output1); title('分裂'); 21 | 22 | %将各块分别标记 23 | i = 0; 24 | for dim = [64 32 16 8 4 2] 25 | [vals,r,c] = qtgetblk(source,S,dim); 26 | if ~isempty(vals) 27 | for j = 1:length(r) 28 | i = i + 1; 29 | blocks(r(j):r(j)+ dim - 1,c(j):c(j)+ dim - 1) = i; 30 | end 31 | end 32 | end 33 | 34 | %将极差较小的块的标记合并 35 | for j = 1 : i 36 | bound = boundarymask(blocks==j,4) & (~(blocks==j)); 37 | [r,l] = find(bound==1); 38 | for k = 1 : size(r,1) 39 | merge = source((blocks==j) | (blocks==blocks(r(k),l(k)))); 40 | if(range(merge(:))