清华大学谷源涛MATLAB图像大作业
根据给定文件的信息,本文将围绕“清华大学谷源涛MATLAB图像大作业”中的关键知识点进行深入探讨。主要内容包括:图像处理基础知识、图像压缩编码及其具体应用实例。 ### 第一部分:基础知识 #### 1. 基础图像处理操作 在这一部分中,通过两个示例介绍了基础的图像处理操作,包括像素颜色修改和图像显示。 **示例一**:通过循环遍历图像的每一个像素,对图像中满足特定条件的部分进行颜色修改,将这些像素的颜色设置为红色(R=255, G=0, B=0)。具体代码如下: ```matlab close all; clear all; clc; load('hall.mat'); T = hall_color; for count = 1:120 for count2 = 1:168 if ((count - 60)^2 + (count2 - 84)^2 <= 3600) T(count, count2, 1) = 255; T(count, count2, 2) = 0; T(count, count2, 3) = 0; end end end image(T); imwrite(T, 'TI1.bmp', 'bmp'); ``` 这段代码首先加载了图像数据,然后使用双重循环遍历图像中的像素,对满足条件 `(count - 60)^2 + (count2 - 84)^2 <= 3600` 的像素进行颜色修改,最终将处理后的图像显示出来并保存为 BMP 格式。 **示例二**:通过类似的循环遍历方法,修改图像中另一部分像素的颜色,将其设置为黑色(R=G=B=0),以形成棋盘式的视觉效果。代码如下: ```matlab close all; clear all; clc; load('hall.mat'); T = hall_color; for count = 1:8 for count2 = 1:8 if mod(count + count2, 2) == 0 T((count - 1)*15 + 1:count*15, (count2 - 1)*21 + 1:count2*21, 1) = 0; T((count - 1)*15 + 1:count*15, (count2 - 1)*21 + 1:count2*21, 2) = 0; T((count - 1)*15 + 1:count*15, (count2 - 1)*21 + 1:count2*21, 3) = 0; end end end image(T); imwrite(T, 'T2.bmp', 'bmp'); ``` 该示例同样使用了双重循环,但这次是对图像中的特定区域进行颜色修改,以创建棋盘样式的效果。 ### 第二部分:图像压缩编码 #### 1. 预处理步骤分析 这部分讨论了图像压缩前的预处理步骤——将每个像素的灰度值减去128。实验表明,这个操作也可以在变换域进行,且结果几乎相同。相关代码如下: ```matlab clear all, close all, clc; load('JpegCoeff.mat'); load('hall.mat'); example = double(hall_gray(1:10, 1:10)); sub = ones(10, 10) * 128; dir = example - sub; in_dir = idct2(dct2(example) - dct2(sub)); ans = dir - in_dir; ``` 通过对比 `dir` 和 `in_dir` 两个变量的结果,得出两者的差异非常小,几乎可以忽略不计。因此,可以认为预处理步骤在变换域进行是可行的。 #### 2. 二维离散余弦变换(DCT)实现与比较 这部分介绍了如何实现二维DCT,并将其结果与MATLAB自带的库函数 `dct2` 进行比较,证明两者的一致性。相关代码如下: ```matlab clear all, close all, clc; load('hall.mat'); example = double(hall_gray(1:10, 1:10)); % 下面是自定义的二维DCT实现 difference = dct2(example) - mydct(example); function [back] = mydct(example) [x, y] = size(example); D = zeros(x, y); for h = 1:x for l = 1:y if h == 1 D(h, l) = sqrt(1 / x); else D(h, l) = sqrt(2 / x) * cos((h - 1) * (2 * l - 1) * pi / (2 * x)); end end end back = D * example * D'; end ``` 通过计算 `difference` 的最大值来评估自定义函数 `mydct` 与内置函数 `dct2` 的差异。结果显示,差异非常小,可以忽略不计,因此证明了自定义的二维DCT函数实现了与MATLAB内置函数相同的功能。 #### 3. DCT系数零化的影响 本节讨论了在图像压缩过程中,对DCT系数矩阵中的特定列进行零化处理对重构图像的影响。相关代码如下: ```matlab clear all, close all, clc; load('JpegCoeff.mat'); load('hall.mat'); middle = dct2(double(hall_gray) - ones(size(hall_gray)) * 128); [x, y] = size(middle); middle1 = [zeros(x, 4), middle(:, (5:y))]; middle2 = [middle(:, (1:(y - 4))), zeros(x, 4)]; transform = idct2(middle) + ones(size(middle)) * 128; transform1 = idct2(middle1) + ones(size(middle)) * 128; transform2 = idct2(middle2) + ones(size(middle)) * 128; figure; imshow(uint8(transform)); figure; imshow(uint8(transform1)); figure; imshow(uint8(transform2)); ``` 通过对 DCT 系数矩阵中右侧四列和左侧四列分别进行零化处理,并对结果进行逆变换,观察到当右侧四列被置零时,图像的右侧部分出现了明显的失真,而当左侧四列被置零时,图像的左侧部分出现了类似的变化。这说明DCT系数矩阵中的每一列都对应着图像的特定频率信息,零化特定列会影响相应频率信息的重建,从而导致图像的局部失真。 通过本作业中的示例和实验,不仅展示了MATLAB在图像处理方面的强大功能,还深入探讨了图像处理的基本概念和技术,特别是关于图像压缩编码的关键步骤及其影响。这对于理解和掌握图像处理技术具有重要的意义。
剩余24页未读,继续阅读
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助