写在前面,这是一篇有关于"XX"大学光学"X"程的数值"XX"课作业的讲解汇总,江月年年望相似,作业也是如此。
本人中秋国庆回不了家,无事可干,故于2023年9月30日决定写下该回答,仅供参考,节约诸位时间。如果Anybody因为照抄导致你自己挂科,并且让老师抗拒这种形式的交流,那你是真该死
最后,愿本回答会成为帮助各位师弟、师妹的渡河之桥,更快抵达你的诗和远方
第一部分:实现的功能
A.要求功能一
1.通过RGB 和HSI色彩空间对一幅彩色图像进行模糊,增加邻域面积(5 * 5, 11 * 11,21 * 21),观察两种空间处理结果的差异 (HSI 只对亮度模糊及对三个分量同时模糊处理的区别)
2.对一幅彩色图像进行色彩处理——灰度图象,怀旧图像(分别用RGB空间和HSI空间)
B.要求功能二
1.使用下面语句生成一对变量,分别使用cftool, polyfit 和 fit 分别进行拟合,给出拟合参数结果和R-square值,并将原变量和拟合结果画在同一幅figure中,x=0:2:20; y=0.1 * x + 0.2 * x .^ 2 + 0.5 * x .^ 5 + 10 * x .^ 10;
第二部分:基本说明
A.用到的函数
rgb2hsi()
老师给的函数,直接问学委或老师要。我看了,实现思路很简单,尊重知识产权和劳动成果,故我不提供。
要注意的是,这个函数要和你作业文件放在同一路径下,即同一文件夹。(放在matlab的默认函数库也可以,听不懂的,直接放在同一文件夹就好了)
这个函数的作用就是将正常rgb的图转换为hsi色域空间的图
hsi2rgb()
老师给的函数,直接问学委或老师要。我看了,实现思路很简单,尊重知识产权和劳动成果,故我不提供。
要注意的是,这个函数要和你作业文件放在同一路径下,即同一文件夹。(放在matlab的默认函数库也可以,听不懂的,直接放在同一文件夹就好了)
这个函数的作用就是将hsi的图转换为rgb三色的图
B.难点思路分析
没有什么特别的难点,就是对怀旧图像可能会有一些不知道怎么下手。我给大家分析一下
下面都是比较完美的方案,大家交作业不要交太完美的,不然可太卷了。你又不加分,老师万一对比一下作业,你让别人纯自己摸索的作业怎么交??!!!!!!
1.rgb图怀旧
对于rgb老照片,关键在于褪色、暗淡和发黄。想要照片看起很老,我们 首先要让它的颜色不那么明亮,其次让它的颜色向黄色靠拢。
%############ 说明 ################
1.发黄:调整增加 红 和 绿 在图片中的比重,图片看起来发黄
2.暗淡:让各种颜色相互影响,时间让照片串色了,单一鲜明的颜色消失
3.褪色:无法参与黄合成的蓝色,要求其总强度数值下降。黄色是纸张长时间放置带来的,强度数值略微增强
%############ 说明 ################
pic_path = 'jiangnan.png' ; %输入图片路径
pic = imread(pic_path); %打开图片
r1 = pic(:,:,1); %红色图
g1 = pic(:,:,2); %绿色图
b1 = pic(:,:,3); %蓝色图
output_r = (r1 * 0.393) + (g1 * 0.769) + (b1 * 0.189); %复古红色图,算法源自Microsoft建议的方程式
output_g = (r1 * 0.349) + (g1 * 0.686) + (b1 * 0.168); %复古绿色图,算法源自Microsoft建议的方程式
output_b = (r1 * 0.272) + (g1 * 0.534) + (b1 * 0.131); %复古蓝色图,算法源自Microsoft建议的方程式
figure;
imshow(pic_rgb_fugu);
title('RGB:怀旧图');
2.hsi图怀旧
基本思路是一样的,也有一些细微的差别,我也没有调的很完美,就这样
%############ 说明 ################
1.发黄:调整增加 红 和 绿 在图片中的比重,图片看起来发黄
2.暗淡:让各种颜色相互影响,时间让照片串色了,单一鲜明的颜色消失
3.褪色:无法参与黄合成的蓝色,要求其总强度数值下降。黄色是纸张长时间放置带来的,强度数值略微增强
%############ 说明 ################
pic_path = 'jiangnan.png' ; %输入图片路径
pic = imread(pic_path); %打开图片
pic_hsi = rgb2hsi(pic); %rgb图转hsi图,使用老师给的函数,请把函数放在本文件同一文件夹下
h1=pic_hsi(:,:,1); %图层:角度? 色调
s1=pic_hsi(:,:,2); %图层:半径? 饱和度
i1=pic_hsi(:,:,3); %图层:高度? 强度
[m,n] = size(h1);
output_i = i1;
output_h = h1;
output_s = s1;
for i=1:m
for j = 1:n
if 0.5 < h1(i,j) && h1(i,j) < 0.833
output_i(i,j) = i1(i,j) * 0.7;
end
end
end
for i=1:m
for j = 1:n
if 0 <= h1(i,j) && h1(i,j) < 0.33
output_h(i,j) = h1(i,j);
end
if 0.33 <= h1(i,j) && h1(i,j) < 0.5
output_h(i,j) = h1(i,j) - 0.33;
end
if 0.5 <= h1(i,j) && h1(i,j) < 0.833
output_h(i,j) = h1(i,j);
end
if 0.833 <= h1(i,j) && h1(i,j) < 1
output_h(i,j) = h1(i,j) - 0.83;
end
if 0 <= s1(i,j) && s1(i,j) < 0.7
output_h(i,j) = 0.167;
end
end
end
output_s = s1 * 0.6;
pic_hsi_fugu(:,:,1) = output_h; %对矩阵进行整合
pic_hsi_fugu(:,:,2) = output_s; %对矩阵进行整合
pic_hsi_fugu(:,:,3) = output_i; %对矩阵进行整合
pic_hsi_fugu = double(pic_hsi_fugu); %奖unit8转化为double
pic_hsi_rgb_fugu = hsi2rgb(pic_hsi_fugu); %hsi图转rgb图,使用老师给的函数,请把函数放在本文件同一文件夹下
%显示结果
figure('Name','HSI色彩空间-灰度图像,怀旧图像');
imshow(pic_hsi_rgb_fugu);
title('HSI:怀旧图');
第三部分:我的作业
作业中我用的图片:
如果你想复现我的结果可以使用,不支持抄作业
第一题
% 文件名: DSH_3_1.m
% 版本: 1.0
% 创建时间: 2023年09月27日 星期三 15:30
% 功能: 1.通过RGB 和HSI色彩空间对一幅彩色图像进行模糊,增加邻域面积(5*5, 11*11,21*21),观察两种空间处理结果的差异 (HSI 只对亮度模糊及对三个分量同时模糊处理的区别)
% 2.对一幅彩色图像进行色彩处理——灰度图象,怀旧图像(分别用RGB空间和HSI空间)
%¥¥¥¥¥¥功能: 1.通过RGB 和HSI色彩空间对一幅彩色图像进行模糊,增加邻域面积(5*5, 11*11,21*21)
%¥¥¥¥¥¥¥¥¥¥观察两种空间处理结果的差异 (HSI 只对亮度模糊及对三个分量同时模糊处理的区别)
pic_path = 'jiangnan.png' ; %输入图片路径
pic = imread(pic_path); %打开图片
figure('Name','原图'); %创建显示原图的窗口
imshow(pic); %显示图片
%##############通过RGB色彩空间对一幅彩色图像进行模糊#################
r1 = pic(:,:,1); %红色图
g1 = pic(:,:,2); %绿色图
b1 = pic(:,:,3); %蓝色图
fil1 = fspecial('average',[5,5]); %创建5 * 5的滤波矩阵。
pic_ave_r1 = imfilter(r1,fil1,'symmetric'); %均值模糊
pic_ave_g1 = imfilter(g1,fil1,'symmetric'); %均值模糊
pic_ave_b1 = imfilter(b1,fil1,'symmetric'); %均值模糊
pic_1(:,:,1) = pic_ave_r1; %对矩阵进行整合
pic_1(:,:,2) = pic_ave_g1; %对矩阵进行整合
pic_1(:,:,3) = pic_ave_b1; %对矩阵进行整合
fil2 = fspecial('average',[11,11]); %创建11 * 11的滤波矩阵。
pic_ave_r2 = imfilter(r1,fil2,'symmetric'); %均值模糊
pic_ave_g2 = imfilter(g1,fil2,'symmetric'); %均值模糊
pic_ave_b2 = imfilter(b1,fil2,'symmetric'); %均值模糊
pic_2(:,:,1) = pic_ave_r2; %对矩阵进行整合
pic_2(:,:,2) = pic_ave_g2; %对矩阵进行整合
pic_2(:,:,3) = pic_ave_b2; %对矩阵进行整合
fil3 = fspecial('average',[21,21]); %创建21 * 21的滤波矩阵。
pic_ave_r3 = imfilter(r1,fil3,'symmetric'); %均值模糊
pic_ave_g3 = imfilter(g1,fil3,'symmetric'); %均值模糊
pic_ave_b3 = imfilter(b1,fil3,'symmetric'); %均值模糊
pic_3(:,:,1) = pic_ave_r3; %对矩阵进行整合
pic_3(:,:,2) = pic_ave_g3; %对矩阵进行整合
pic_3(:,:,3) = pic_ave_b3; %对矩阵进行整合
%显示结果
figure('Name','RGB均值模糊');
subplot(1,3,1);
imshow(pic_1);
title('RGB:5 * 5均值模糊');
subplot(1,3,2);
imshow(pic_2);
title('RGB:11 * 11均值模糊');
subplot(1,3,3);
imshow(pic_3);
title('RGB:21 * 21均值模糊');
%##############通过HSI色彩空间对一幅彩色图像进行模糊#################
pic_hsi = rgb2hsi(pic); %rgb图转hsi图,使用老师给的函数,请把函数放在本文件同一文件夹下
h1=pic_hsi(:,:,1); %图层:角度? 色调
s1=pic_hsi(:,:,2); %图层:半径? 饱和度
i1=pic_hsi(:,:,3); %图层:高度? 强度
fil1 = fspecial('average',[5,5]); %创建5 * 5的滤波矩阵。
pic_ave_i1 = imfilter(i1,fil1,'symmetric'); %均值模糊
pic_hsi_1(:,:,3) = pic_ave_i1; %对矩阵进行整合
pic_hsi_1(:,:,2) = s1; %对矩阵进行整合
pic_hsi_1(:,:,1) = h1; %对矩阵进行整合
pic_rgb_1 = hsi2rgb(pic_hsi_1); %hsi图转rgb图,使用老师给的函数,请把函数放在本文件同一文件夹下
fil2 = fspecial('average',[11,11]); %创建11 * 11的滤波矩阵。
pic_ave_i2 = imfilter(i1,fil2,'symmetric'); %均值模糊
pic_hsi_2(:,:,3) = pic_ave_i2; %对矩阵进行整合
pic_hsi_2(:,:,2) = s1; %对矩阵进行整合
pic_hsi_2(:,:,1) = h1; %对矩阵进行整合
pic_rgb_2 = hsi2rgb(pic_hsi_2); %hsi图转rgb图,使用老师给的函数,请把函数放在本文件同一文件夹下
fil3 = fspecial('average',[21,21]); %创建21 * 21的滤波矩阵。
pic_ave_i3 = imfilter(i1,fil2,'symmetric'); %均值模糊
pic_hsi_3(:,:,3) = pic_ave_i3; %对矩阵进行整合
pic_hsi_3(:,:,2) = s1; %对矩阵进行整合
pic_hsi_3(:,:,1) = h1; %对矩阵进行整合
pic_rgb_3 = hsi2rgb(pic_hsi_3); %hsi图转rgb图,使用老师给的函数,请把函数放在本文件同一文件夹下
%显示结果
figure('Name','HSI均值模糊');
subplot(1,3,1);
imshow(pic_rgb_1);
title('HSI:5 * 5均值模糊');
subplot(1,3,2);
imshow(pic_rgb_2);
title('HSI:11 * 11均值模糊');
subplot(1,3,3);
imshow(pic_rgb_3);
title('HSI:21 * 21均值模糊');
%¥¥¥¥¥¥功能: 2.对一幅彩色图像进行色彩处理——灰度图象,怀旧图像(分别用RGB空间和HSI空间)
%##############通过RGB色彩空间对一幅彩色图像进行色彩处理--灰度图像,怀旧图像#################
%##############灰度图像#################
pic_gray = rgb2gray (pic); %生成灰度图
%显示结果
figure('Name','RGB色彩空间-灰度图像,怀旧图像');
subplot(1,2,1);
imshow(pic_gray);
title('RGB:灰度图');
%##############怀旧图像#################
r1 = pic(:,:,1); %红色图
g1 = pic(:,:,2); %绿色图
b1 = pic(:,:,3); %蓝色图
output_r = (r1 * 0.393) + (g1 * 0.769) + (b1 * 0.189); %复古红色图,算法源自Microsoft建议的方程式
output_g = (r1 * 0.349) + (g1 * 0.686) + (b1 * 0.168); %复古绿色图,算法源自Microsoft建议的方程式
output_b = (r1 * 0.272) + (g1 * 0.534) + (b1 * 0.131); %复古蓝色图,算法源自Microsoft建议的方程式
pic_rgb_fugu(:,:,1) = output_r; %对矩阵进行整合
pic_rgb_fugu(:,:,2) = output_g; %对矩阵进行整合
pic_rgb_fugu(:,:,3) = output_b; %对矩阵进行整合
%显示结果
subplot(1,2,2);
imshow(pic_rgb_fugu);
title('RGB:怀旧图');
%##############通过HSI色彩空间对一幅彩色图像进行色彩处理--灰度图像,怀旧图像#################
%##############怀旧图像#################
pic_hsi = rgb2hsi(pic); %rgb图转hsi图,使用老师给的函数,请把函数放在本文件同一文件夹下
h1=pic_hsi(:,:,1); %图层:角度? 色调
s1=pic_hsi(:,:,2); %图层:半径? 饱和度
i1=pic_hsi(:,:,3); %图层:高度? 强度
output_h = h1 * 0.5; %复古色调图,我自己乱调的,没找到现成的方案---DSH空白
output_s = s1 * 0.2; %复古饱和度图,我自己乱调的,没找到现成的方案---DSH空白
output_i = i1 * 0.6; %复古强度图,我自己乱调的,没找到现成的方案---DSH空白
pic_hsi_fugu(:,:,1) = output_h; %对矩阵进行整合
pic_hsi_fugu(:,:,2) = output_s; %对矩阵进行整合
pic_hsi_fugu(:,:,3) = output_i; %对矩阵进行整合
pic_hsi_fugu = double(pic_hsi_fugu); %奖unit8转化为double
pic_hsi_rgb_fugu = hsi2rgb(pic_hsi_fugu); %hsi图转rgb图,使用老师给的函数,请把函数放在本文件同一文件夹下
%显示结果
figure('Name','HSI色彩空间-灰度图像,怀旧图像');
subplot(1,2,2);
imshow(pic_hsi_rgb_fugu);
title('HSI:怀旧图');
%##############灰度图像#################
pic_hsi_gray(:,:,1) = h1; %对矩阵进行整合,我自己乱调的,没找到现成的方案---DSH空白
pic_hsi_gray(:,:,2) = s1 * 0; %对矩阵进行整合,我自己乱调的,没找到现成的方案---DSH空白
pic_hsi_gray(:,:,3) = i1; %对矩阵进行整合,我自己乱调的,没找到现成的方案---DSH空白
pic_hsi_gray = hsi2rgb(pic_hsi_gray); %hsi图转rgb图,使用老师给的函数,请把函数放在本文件同一文件夹下
%显示结果
subplot(1,2,1);
imshow(pic_hsi_gray);
title('HSI:灰度图');
fprintf('Hello, world\t --from DSH\n'); %彩蛋
第二题
% 文件名: DSH_3_2.m
% 版本: 1.0
% 创建时间: 2023年09月27日 星期三 15:30
% 功能: 1使用下面语句生成一对变量,分别使用cftool, polyfit 和 fit 分别进行拟合,给出拟合参数结果和R-square值,并将原变量和拟合结果画在同一幅figure中,x=0:2:20; y=0.1*x+0.2*x.^2+0.5*x.^5+10*x.^10;
x = 0 : 2 : 20; %老师让选的x的值
y = 0.1 * x + 0.2 * x .^ 2 + 0.5 * x .^ 5 + 10 * x .^ 10; %老师给定的函数关系
cftool;
a = polyfit(x,y,7); %进行polyfit拟合
y_polyfit = a(1) * x .^ 7 + a(2) * x .^ 6 + a(3) * x .^ 5 + a(4) * x .^ 4 + a(5) * x .^ 3 + a(6) * x .^ 2 + a(7) * x .^ 1 + a(8) * x .^ 0; %生成拟合后表达式,计算y_polyfit的值
f = fittype('p1 * x + p2 * x .^ 2 + p3 * x .^ 5 + p4 * x .^ 10'); %设置fittype,即设置函数的形式,我设置的函数和原函数一摸一样,故R-square一定是1!!
[c,gof] = fit(x',y',f,'StartPoint', [0, 0, 0, 0]); %用fit拟合,startpoint为设置p1、p2、p3、p4的初始值
y_fit = c.p1 * x + c.p2 * x .^ 2 + c.p3 * x .^ 5 + c.p4 * x .^ 10; %生成拟合后表达式,计算y_fit的值
x1 = 0 : 1 : 40; %重新生成我要的x值,以求R-square
y1 = 0.1 * x1 + 0.2 * x1 .^ 2 + 0.5 * x1 .^ 5 + 10 * x1 .^ 10; %用重新生成的x值,生成一个更细致的原函数
y1_polyfit = a(1) * x1 .^ 7 + a(2) * x1 .^ 6 + a(3) * x1 .^ 5 + a(4) * x1 .^ 4 + a(5) * x1 .^ 3 + a(6) * x1 .^ 2 + a(7) * x1 .^ 1 + a(8) * x1 .^ 0; %用重新生成的x值,生成一个更细致的polyfit拟合函数
y1_fit = c.p1 * x1 + c.p2 * x1 .^ 2 + c.p3 * x1 .^ 5 + c.p4 * x1 .^ 10; %用重新生成的x值,生成一个更细致的fit拟合函数
r2_polyfit = 1 - sum((y1(:)-y1_polyfit(:)).^2)/sum((y1(:)-mean(y1(:))).^2); %计算polyfit拟合的R-square,其中sum函数为求和,mean函数为求平均
r2_fit = 1 - sum((y1(:)-y1_fit(:)).^2)/sum((y1(:)-mean(y1(:))).^2); %计算fit拟合的R-square,其中sum函数为求和,mean函数为求平均
figure %创建显示窗口
plot(x1, y1, 'ro', x1, y1_polyfit ,'g*', x1, y1_fit, 'b-'); %画图
legend('原函数', strcat(['polyfit拟合,R2 = ' num2str(r2_polyfit)]),strcat(['fit拟合,R2 = ' num2str(r2_fit)])); %写标注,num2str函数将数字转为字符,strcat函数组合两个字符串
fprintf('Hello, world\t --from DSHkongbai\n'); %彩蛋