RGB和HSI色彩空间怀旧图像与数值拟合

写在前面,这是一篇有关于"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:怀旧图');

第三部分:我的作业

作业中我用的图片:

jiangnan.png
如果你想复现我的结果可以使用,不支持抄作业

第一题

%   文件名:     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');        %彩蛋
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值