数字图像处理:实验二

任务一:

将不同像素(32、64和256)的原图像放大为像素大 小为1024*1024的图像(图像自选)

要求:1)输出一幅图,该图包含六幅子图,第一排是原图,第 二排是对应放大的图; 2)每幅图的顶头都加上小标题

(解释过程原理:实际上这里用到的图像操作就是调用函数来增加它的像素点数,实际生活中的压缩和解压图像中也会有这种操作,用法就是调用imresize函数即可。之余之后建立一个新的窗口和简单的内容分布,实际上的操作可以会看第一章的基本操作。)

Matlab 复制代码
A = imread('1.jpg');  
  
%将图像A的大小调整为32x32像素,结果存储在变量img32中  
img32 = imresize(A,[32,32]);    
%将图像A的大小调整为64x64像素,结果存储在变量img64中  
img64 = imresize(A,[64,64]);    
%将图像A的大小调整为256x256像素,结果存储在变量img256中  
img256 = imresize(A,[256,256]);    
  
%将32x32的图像img32放大到1024x1024像素,结果存储在变量img32_resized中  
img32_resized = imresize(img32, [1024, 1024]);    
%将64x64的图像img64放大到1024x1024像素,结果存储在变量img64_resized中  
img64_resized = imresize(img64, [1024, 1024]);    
%将256x256的图像img256放大到1024x1024像素,结果存储在变量img256_resized中  
img256_resized = imresize(img256, [1024, 1024]);    
  
%创建一个新的图形窗口用于显示图像  
figure;    
  
%在图形窗口的2x3网格中的第一个位置显示32x32的原图  
subplot(2,3,1);    
imshow(img32);  % 显示图像  
title('32x32 原图');  % 设置图像标题  
  
%在图形窗口的2x3网格中的第二个位置显示64x64的原图  
subplot(2,3,2);    
imshow(img64);  % 显示图像  
title('64x64 原图');  % 设置图像标题  
  
%在图形窗口的2x3网格中的第三个位置显示256x256的原图  
subplot(2,3,3);    
imshow(img256);  % 显示图像  
title('256x256 原图');  % 设置图像标题  
  
%在图形窗口的2x3网格中的第四个位置显示32x32放大到1024x1024的图像  
subplot(2,3,4);    
imshow(img32_resized);  % 显示图像  
title('32x32 放大到1024x1024');  % 设置图像标题  
  
% 在图形窗口的2x3网格中的第五个位置显示64x64放大到1024x1024的图像  
subplot(2,3,5);    
imshow(img64_resized);  % 显示图像  
title('64x64 放大到1024x1024');  % 设置图像标题  
  
%在图形窗口的2x3网格中的第六个位置显示256x256放大到1024x1024的图像  
subplot(2,3,6);    
imshow(img256_resized);  % 显示图像  
title('256x256 放大到1024x1024');  % 设置图像标题

结果如下:

任务二:去噪声

要求:

1)对所选图添加噪声(可以选择高斯噪声或椒盐噪声),次数为10次、 30 次和50次;

2)对添加噪声后的图像去噪;

3)输出一幅图,该图包含七幅子图,共三排,第一排是 原图,第二排是添加噪声后的图;第三排是对应去噪声后的图像;

4)每幅图的顶头都加上小标踢;

(操作重点:第一、了解所添加的噪声类型和matlab函数的使用方法,第二、了解噪声的特性,第三、学会查找和调用函数)

Matlab 复制代码
img1 = imread('1.png');  
% 如果是彩色图像,则将其转换为灰度图像  
if size(img1, 3) == 3  
    img = rgb2gray(img1);  % 使用rgb2gray函数将彩色图像转换为灰度图像  
end  
  
% 向灰度图像img中添加椒盐噪声  
% 噪声密度为0.01,相当于添加"10次"噪声 
noisy_img10 = imnoise(img, 'salt & pepper', 0.01);  
% 噪声密度为0.03,相当于添加"30次"噪声
noisy_img30 = imnoise(img, 'salt & pepper', 0.03);  
% 噪声密度为0.05,相当于添加"50次"噪声  
noisy_img50 = imnoise(img, 'salt & pepper', 0.05);  
  
% 使用中值滤波对添加噪声后的图像进行去噪处理  
denoised_img10 = medfilt2(noisy_img10);  % 对噪声密度为0.01的图像进行去噪  
denoised_img30 = medfilt2(noisy_img30);  % 对噪声密度为0.03的图像进行去噪  
denoised_img50 = medfilt2(noisy_img50);  % 对噪声密度为0.05的图像进行去噪  
  
% 创建一个新的图形窗口用于显示图像  
figure;  
  
% 在图形窗口的3x3网格中的第一个位置显示原图  
subplot(3,3,1);  
imshow(img1);  % 显示原图(如果是彩色图则显示彩色图,如果是灰度图则显示灰度图)  
title('原图');  % 设置图像标题  
  
% 在图形窗口的3x3网格中的第四、五、六个位置分别显示添加不同密度椒盐噪声后的图像  
subplot(3,3,4);  
imshow(noisy_img10);  % 显示噪声密度为0.01的图像  
title('椒盐噪声密度0.01');  % 设置图像标题
subplot(3,3,5);  
imshow(noisy_img30);  % 显示噪声密度为0.03的图像  
title('椒盐噪声密度0.03');  % 设置图像标题
subplot(3,3,6);  
imshow(noisy_img50);  % 显示噪声密度为0.05的图像  
title('椒盐噪声密度0.05');  % 设置图像标题
% 在图形窗口的3x3网格中的第七、八、九个位置分别显示去噪后的图像  
% 注意:原代码中的标题有误,将"高斯噪声"更正为"椒盐噪声"  
subplot(3,3,7);  
imshow(denoised_img10);  % 显示去噪后的噪声密度为0.01的图像  
title('去噪后的椒盐噪声密度0.01');  % 设置图像标题
subplot(3,3,8);  
imshow(denoised_img30);  % 显示去噪后的噪声密度为0.03的图像  
title('去噪后的椒盐噪声密度0.03');  % 设置图像标题  
subplot(3,3,9);  
imshow(denoised_img50);  % 显示去噪后的噪声密度为0.05的图像  
title('去噪后的椒盐噪声密度0.05');  % 设置图像标题

结果:

任务三:图像的补集以及对两幅图求并集

要求:

1)求原图的补集;

2)以该图像平均灰度值的3倍获得均值图,并将它与原图做并集操作;

3)输出一幅图,该图包含一排的三幅子图,从左到右为: 原图、补集图和并集图。

4)每幅图的顶头都加上小标题。

(操作重点:第一、了解数字图像处理时的并集、补集的含义,主要是记住其实现时存在的图像然后理解就方便很多,第二、注意理解要求(2)中的获得均值图后在与原图求取并集操作,了解其作用,咸鱼哥建议可以先尝试一下不做并集得到的图像,这样会更方便理解这个概念。)

Matlab 复制代码
A = imread('1.jpg');  
  
% 将图像A转换为双精度类型(double),并将像素值归一化到 [0, 1] 区间  
% 这是因为imread读取的图像通常是uint8类型,像素值在 [0, 255] 区间  
A = im2double(A);  
img_1 = A;  
img_2 = A;  
% 计算原图像A灰度值的三倍,并将结果存储在变量N中  
N = 3 * A;  
% 使用min函数确保N中的值不超过1,对于大于1的值,将其设置为1  
N = min(N, 1);  
% 调用自定义函数set_comple计算图像A的补集,并将结果存储在变量h中  
% 补集是指将图像中的每个像素值用1减去该像素值得到的图像  
h = set_comple(A);  
% 调用自定义函数set_union计算图像A和它的三倍图像N的并集,并将结果存储在变量j中  
% 对于两幅图像来说,并集是指逐元素取两幅图像中较大的那个值  
j = set_union(A, N);  
  
% 创建一个新的图形窗口用于显示图像  
figure;  
% 在图形窗口的1x3网格中的第一个位置显示原图A  
subplot(1, 3, 1), imshow(A), title('原图');  
% 在图形窗口的1x3网格中的第二个位置显示补集图像h  
subplot(1, 3, 2), imshow(h), title('补集图');  
% 在图形窗口的1x3网格中的第三个位置显示并集图像j  
subplot(1, 3, 3), imshow(j), title('并集图');  
  
% 定义计算补集的函数set_comple  
% 输入参数f为待计算补集的图像  
% 输出参数img_1为计算得到的补集图像  
function img_1 = set_comple(f)  
    img_1 = 1 - f;  % 计算补集:将每个像素值用1减去  
end  
  
% 定义计算并集的函数set_union  
% 输入参数f1和f2为待计算并集的两幅图像  
% 输出参数img_2为计算得到的并集图像  
function img_2 = set_union(f1, f2)  
    img_2 = max(f1, f2);  % 计算并集:逐元素取两幅图像中较大的值  
End

结果:

任务四:多种噪声添加及多种滤波

要求:

1)对原图添加多种不同类型、不同程度的噪声,包括高斯噪声、椒盐噪声、泊松噪声等(至少3种噪声),噪声参数自己拟定, 但须得到有对比性噪声效果的图像(泊松噪声的参数可以只添加1 次);

2)然后使用不同的滤波方法进行降噪,如中值滤波、自适 应中值滤波、小波降噪等(至少3种滤波方法);

3)输出一幅图,该图至少包含原图(1张)、噪声图(至少5张)和滤波图(至少3张),一共至少9张子图;

4)每幅图的顶头都加上小标题。

(操作重点:这里针对不同类型、不同程度的噪声要重点理解,可以直接在matlab的函数库中搜索函数,这样会显示噪声类型和种类,但是要求英语水平足够扎实才推荐去看。)

Matlab 复制代码
d = imread('3.jfif');    
% 将图像d转换为双精度类型(double),以便进行后续处理  
% 因为imread读取的图像通常是uint8类型,像素值在 [0, 255] 区间  
% 转换为double后,像素值会被归一化到 [0, 1] 区间  
d_double = im2double(d);    
% 添加噪声并滤波处理部分    
% 向图像d_double添加高斯噪声,方差为(0.005*5)^2,相当于添加5次高斯噪声的累积效果(但实际上是直接设置了一个较大的方差)  
I1 = imnoise(d_double, 'gaussian', 0, 0.005*5^2);  
% 向I1添加泊松噪声  
I1 = imnoise(I1, 'poisson');  
% 向I1添加斑点噪声,噪声密度为0.2  
I111 = imnoise(I1, 'speckle', 0.2);   
% 向图像d_double添加高斯噪声,方差为(0.001*2)^2,相当于添加2次高斯噪声的累积效果(但实际上是直接设置了一个较小的方差)  
I2 = imnoise(d_double, 'gaussian', 0, 0.001*2^2);  
% 向I2添加泊松噪声  
I2 = imnoise(I2, 'poisson');  
% 向I2添加斑点噪声,噪声密度为0.1  
I222 = imnoise(I2, 'speckle', 0.1);   
% 向图像d_double添加一次较高方差的高斯噪声,方差为0.1^2  
I3 = imnoise(d_double, 'gaussian', 0, 0.1^2);  
% 向I3添加泊松噪声  
I3 = imnoise(I3, 'poisson');  
% 向I3添加斑点噪声,噪声密度非常低,为0.001  
I333 = imnoise(I3, 'speckle', 0.001);    
% 向图像d_double添加椒盐噪声,噪声密度为0.03  
I4 = imnoise(d_double, 'salt & pepper', 0.03);  
% 向I4添加高斯噪声,方差为0.1^2  
I44 = imnoise(I4, 'gaussian', 0, 0.1^2);  
% 向I44添加泊松噪声  
I444 = imnoise(I44, 'poisson');  
% 这行代码是多余的,因为I444已经是double类型,但不会影响后续操作  
I444_d = I444;   
% 向图像d_double添加椒盐噪声,噪声密度为0.02(实际上这是椒盐噪声,但比例较低时椒噪声可能不明显)  
I5 = imnoise(d_double, 'salt & pepper', 0.02);  
% 这行代码没有做任何处理,可能是为了保持格式一致而保留的  
I5 = I5;  
% 向I5添加高斯噪声,方差为0.01^2  
I55 = imnoise(I5, 'gaussian', 0, 0.01^2);  
% 向I55添加泊松噪声  
I555 = imnoise(I55, 'poisson');  
% 滤波处理部分  
% 创建一个5x5大小的高斯滤波器,标准差为1.4  
h1 = fspecial('gaussian', [5 5], 1.4);  
% 使用高斯滤波器h1对I444_d进行滤波处理  
f_I444 = imfilter(I444_d, h1);   
% 创建一个3x3大小的均值滤波器  
h2 = fspecial('average', [3 3]);  
% 使用均值滤波器h2对I333进行滤波处理  
f_I333 = imfilter(I333, h2);  
% 使用均值滤波器h2对I555进行滤波处理  
f_I555 = imfilter(I555, h2);   
% 显示图像部分   
% 创建一个新的图形窗口  
figure;  
% 在3x3的网格中的第一个位置显示原图像d  
subplot(3,3,1), imshow(d), title('原图像');  
% 在3x3的网格中的第二个位置显示噪声图1(经过高斯、泊松、斑点噪声处理后的图像I111)  
subplot(3,3,2), imshow(I111), title('噪声图1(高斯+泊松+斑点)');  
% 在3x3的网格中的第三个位置显示噪声图2(经过高斯、泊松、斑点噪声处理后的图像I222)  
subplot(3,3,3), imshow(I222), title('噪声图2(高斯+泊松+斑点)');  
% 在3x3的网格中的第四个位置显示噪声图3(经过高斯、泊松、斑点噪声处理后的图像I333)  
subplot(3,3,4), imshow(I333), title('噪声图3(高斯+泊松+斑点)');  
% 在3x3的网格中的第五个位置显示噪声图4(经过椒盐、高斯、泊松噪声处理后的图像I444)  
subplot(3,3,5), imshow(I444), title('噪声图4(椒盐+高斯+泊松)');  
% 在3x3的网格中的第六个位置显示噪声图5(经过椒盐、高斯、泊松噪声处理后的图像I555)  
subplot(3,3,6), imshow(I555), title('噪声图5(椒盐+高斯+泊松)');  
% 在3x3的网格中的第七个位置显示对噪声图4进行高斯滤波后的图像f_I444  
subplot(3,3,7), imshow(f_I444), title('对噪声图4高斯滤波');  
% 在3x3的网格中的第八个位置显示对噪声图3进行平均滤波后的图像f_I333  
subplot(3,3,8), imshow(f_I333), title('对噪声图3平均滤波');  
% 在3x3的网格中的第九个位置显示对噪声图5进行平均滤波后的图像f_I555  
subplot(3,3,9), imshow(f_I555), title('对噪声图5平均滤波');

结果:

任务五:旋转和放大(原图自选)

要求:

1)将原图像旋转不同角度(至少2个角度),并对旋转后的图放大处理(放大到1024*1024);

2)输出一幅图,该图至少包含原图(1张)、旋转图(至少2张)和滤波图(至少2张),一共至少5张子图;

3)每幅图的顶头都加上小标题。

(操作重点:这里的操作基本上没有困难,所以咸鱼哥不重点赘述,记住imrotate和 imresize两个函数的作用就可以了)

Matlab 复制代码
img = imread('1.png');  
  
% 使用imrotate函数将图像img旋转45度,结果存储在rotated_img_45中  
rotated_img_45 = imrotate(img, 45);  
% 使用imrotate函数将图像img旋转90度,结果存储在rotated_img_90中  
rotated_img_90 = imrotate(img, 90);  
  
% 使用imresize函数将旋转45度后的图像rotated_img_45放大到1024x1024像素,结果存储在rotated_img_45_resized中  
rotated_img_45_resized = imresize(rotated_img_45, [1024, 1024]);  
% 使用imresize函数将旋转90度后的图像rotated_img_90放大到1024x1024像素,结果存储在rotated_img_90_resized中  
rotated_img_90_resized = imresize(rotated_img_90, [1024, 1024]);  
  
% 创建一个新的图形窗口,用于显示图像  
figure;  
  
% 使用subplot函数在2x3的网格中的第一个位置创建一个子图,并显示原图img  
subplot(2,3,1);  
imshow(img);  
title('原图'); % 设置子图的标题为"原图"  
  
% 使用subplot函数在2x3的网格中的第二个位置创建一个子图,并显示旋转45度后的图像rotated_img_45  
subplot(2,3,2);  
imshow(rotated_img_45);  
title('旋转45度'); % 设置子图的标题为"旋转45度"  
  
% 使用subplot函数在2x3的网格中的第三个位置创建一个子图,并显示旋转90度后的图像rotated_img_90  
subplot(2,3,3);  
imshow(rotated_img_90);  
title('旋转90度'); % 设置子图的标题为"旋转90度"  
  
% 使用subplot函数在2x3的网格中的第四个位置创建一个子图,并显示旋转45度后放大的图像rotated_img_45_resized  
subplot(2,3,4);  
imshow(rotated_img_45_resized);  
title('旋转45度后放大'); % 设置子图的标题为"旋转45度后放大"  
  
% 使用subplot函数在2x3的网格中的第五个位置创建一个子图,并显示旋转90度后放大的图像rotated_img_90_resized  
subplot(2,3,5);  
imshow(rotated_img_90_resized);  
title('旋转90度后放大'); % 设置子图的标题为"旋转90度后放大"

结果:

第二章针对于数字图像处理的内容的练习和实际的操作,咸鱼哥个人觉得本章内容较为简单,也比较适合初学者和爱好者来学习,本章代码基本上我把逻辑和操作都写上了注释,方便大家理解和使用,为了促进数字图像处理技术的学习,我们一起加油!uu们!

相关推荐
硅谷秋水4 小时前
面向长上下文自动驾驶的规划对齐Token压缩
人工智能·深度学习·机器学习·计算机视觉·自动驾驶
LabVIEW开发5 小时前
LabVIEW + MATLAB 混合编程:爆炸场测试数据精准采集方案
开发语言·matlab·labview
YOLO数据集集合5 小时前
无人机山地灾害巡检数据集 | 滑坡多区域实例分割 遥感影像解译 地质灾害预警深度学习数据10296期
人工智能·深度学习·目标检测·计算机视觉·无人机
袁小皮皮不皮6 小时前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
庄周迷蝴蝶6 小时前
Vision Banana
人工智能·计算机视觉
装不满的克莱因瓶6 小时前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
清辞8537 小时前
产品经理需求推进流程
大数据·深度学习·学习·产品经理
YM52e8 小时前
鸿蒙PC ArkTS 声明合并问题深度解析与最佳实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
海兰9 小时前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
ken22329 小时前
在 Libreoffice Calc中输入自定义表情字符时,需要保存之后,才能正常显示
学习