写在前面,这是一篇有关于"XX"大学光学"X"程的数值"XX"课作业的讲解汇总,江月年年望相似,作业也是如此。
本人中秋国庆回不了家,无事可干,故于2023年9月30日决定写下该回答,仅供参考,节约诸位时间。如果Anybody因为照抄导致你自己挂科,并且让老师抗拒这种形式的交流,那你是真该死
最后,愿本回答会成为帮助各位师弟、师妹的渡河之桥,更快抵达你的诗和远方
第一部分:实现的功能
A.要求功能一
- 从文件夹中读取一幅图像(黑白) (C:\Program
Files\MATLAB\R2010b\toolbox\images\imdemos\cameraman.tif); - 将图像垂直翻转和水平翻转,分别显示出来并将翻转后的图像保存到桌面上(循环/函数)
- 图像类间转换为:将图像转化为double 类型,将double类转
化为图像类,将灰度图像转化为二值图像(黑白图像); - 用plot绘制图像中间行的数据;
- 将整个文件保存为一个Function的m文件 ;
B.要求功能二
- 读取peppers.png图像
- 将三个图层分别赋值给 f1,f2,f3三个矩阵
- 求红色图层与绿色图层的差值,并显示。
- 调整显示范围,获得最好对比度图像
第二部分:基本说明
A.用到的函数
imread()
基本用法:
将pic_path路径的图片读取为一个矩阵(彩色图为3维矩阵,灰度图为2维矩阵),赋值给pic变量,你需要定义一个图片路径,应用如下:
pic_path = 'cameraman.tif' ; %输入图片路径
pic = imread(pic_path); %打开并读取图片
figure()
基本用法:
创建显示的窗口,在matlab中要先创建一个窗口,然后在窗口中作图。可以为窗口命名,为可以用title函数为窗口里的图表命名。应用如下:
figure('Name','窗口名字'); %创建显示的窗口
又或者不为窗口命名
figure(); %创建显示的窗口
imshow()
基本用法:
将一个矩阵显示为图片,在matlab中要先创建一个窗口。对于灰度图,可以用它来调整显示范围。应用如下:
figure(); %创建显示的窗口
imshow(pic); %显示图片
%imshow (pic, [low, high]); %调整显示范围,low为可显示的最低值,high为可显示的最高值
%灰度图范围为0-255
imshow (pic, [200,255]); %调整显示范围,200为可显示的最低值,255为可显示的最高值
imwrite()
基本用法:
将一个矩阵保存为 指定路径、指定名字 的图片,要先定义一个路径。应用如下:
win_path = 'C:\Users\DSH\Desktop\'; %输入保存路径--默认是DSH的桌面
imwrite(pic,strcat(win_path,'pic.jpg')); %保存图片到桌面
% strcat(win_path,'pic.jpg') 为组合字符串 会成为 'C:\Users\DSH\Desktop\pic.jpg'
其中strcat函数用于组合win_path和’pic.jpg’,你也可以直接写,图片保存位置为C:\Users\DSH\Desktop\ ,图片名字为pic.jpg
%直接写如下
win_path = 'C:\Users\DSH\Desktop\pic.jpg'; %输入保存路径--默认是DSH的桌面
imwrite(pic,win_path); %保存图片到桌面
或者
%直接写如下
imwrite(pic,'C:\Users\DSH\Desktop\pic.jpg'); %保存图片到桌面
im2double()、im2uint8()、im2bw()
这些没啥好说的,看一眼就知道了
pic_double = im2double(pic); %将图片矩阵类转化为double
pic_uint8 = im2uint8(pic_double); %将double转化为图片矩阵类
pic_bw = im2bw(pic,0.8); %将灰度图二值化
我解释一下 im2bw(),二值化意思是只有0和1两个值,im2bw是把正常矩阵化为只有0和1的矩阵。其中 im2bw(pic,0.8) 中的pic为图片矩阵,0.8为二值化阈值。0.8对应到灰度值0-255之中,大概是 0.8*255 = 204,灰度图片矩阵中大于204的值变为1,小于或等于204的值变为0。
size()
这个函数可以获得行数hang_shu和列数lie_shu
[hang_shu,lie_shu]=size(pic); %获得行数hang_shu和列数lie_shu
其他写法
hang_shu = size(pic,1); %获得行数
lie_shu = size(pic,2); %获得列数
B.难点思路分析
难点:将图像垂直翻转和水平翻转,分别显示出来并将翻转后的图像保存到桌面上(循环/函数)
1、循环
这不难,你一看就能懂
pic_path = 'cameraman.tif' ; %输入图片路径
pic = imread(pic_path); %打开并读取图片
[hang_shu,lie_shu] = size(pic);
%##############垂直翻转################
for i = 1:fix(hang_shu/2)
a = pic(i,:);
b = pic(hang_shu + 1 - i,:);
pic(i,:) = b;
pic(hang_shu + 1 - i,:) = a;
end
%##############垂直翻转################
figure(); %创建显示的窗口
imshow(pic); %显示图片
2、函数
更简单了,flipdim函数,百度一下,你就知道了
pic_vertical = flipdim(pic,1); %将灰度图垂直翻转
pic_level = flipdim(pic,2); %将灰度图水平翻转
3、反向赋值 (老师没给的思路,不建议,可能没分)
pic_path = 'cameraman.tif' ; %输入图片路径
pic = imread(pic_path); %打开并读取图片
[hang_shu,lie_shu] = size(pic);
%##############垂直翻转################
pic_a = pic(hang_shu:-1:1,:); %反向赋值
%##############垂直翻转################
figure(); %创建显示的窗口
imshow(pic_a); %显示图片
第三部分:我的作业
第一题
% 文件名: Function.m
% 版本: 1.0
% 创建时间: 2023年09月12日 星期二 20:32
% 函数名: Function
% 功能: 1. 从文件夹中读取一幅图像;
% 2. 将图像垂直翻转和水平翻转,分别显示出来并将翻转后的图像 保存到桌面上
% 3. 图像类间转换为:将图像转化为double 类型,将double类转 化为图像类,将灰度图像转化为二值图像(黑白图像);
% 4. 用plot绘制图像中间行的数据;
% 5. 将整个文件保存为一个Function的m文件 ;
function f_pic = Function()
pic_path = 'cameraman.tif' ; %输入图片路径
win_path = 'C:\Users\DSH\Desktop\'; %输入保存路径--默认是DSH的桌面
pic_gray = imread(pic_path); %打开图片
figure('Name','原图'); %创建显示原图的窗口
imshow(pic_gray); %显示图片
% pic_gray = rgb2gray (pic); %将图片转化为灰度图
%
% figure('Name','灰度图'); %创建显示灰度图的窗口
% imshow(pic_gray); %显示图片
pic_vertical = flipdim(pic_gray,1); %将灰度图垂直翻转
figure('Name','垂直翻转灰度图'); %创建显示垂直翻转灰度图的窗口
imshow(pic_vertical); %显示图片
imwrite(pic_vertical,strcat(win_path,'vertical.jpg')); %保存垂直翻转灰度图到桌面
pic_level = flipdim(pic_gray,2); %将灰度图水平翻转
figure('Name','水平翻转灰度图'); %创建显示水平翻转灰度图的窗口
imshow(pic_level); %显示图片
imwrite(pic_level,strcat(win_path,'level.jpg')); %保存水平翻转灰度图到桌面
pic_double = im2double(pic_gray); %将图片类转化为double
pic_uint8 = im2uint8(pic_double); %将double转化为图片类
pic_bw = im2bw(pic_gray,0.8); %将灰度图二值化
figure('Name','二值图'); %创建显示二值图的窗口
imshow(pic_bw); %显示图片
pic_gray_numx = size(pic_gray,1); %行数
pic_gray_numy = size(pic_gray,2); %列数
pic_gray_y = pic_gray(fix(pic_gray_numx/2),:);
figure('Name','图片中间行图像'); %创建显示图片中间行图像的窗口
plot(1:1:pic_gray_numy,pic_gray_y); %图片中间行数据
fprintf('hello,world\t--from DSH\n'); %彩蛋
第二题
% 文件名: DSH_1_2.m
% 版本: 1.0
% 创建时间: 2023年09月13日 星期三 20:32
% 功能: 1. 读取peppers.png图像
% 2. 将三个图层分别赋值给 f1,f2,f3三个矩阵
% 3. 求红色图层与绿色图层的差值,并显示。
% 4. 调整显示范围,获得最好对比度图像
pic_path = 'peppers.png' ; %输入图片路径
pic = imread(pic_path); %打开图片
figure('Name','原图'); %创建显示原图的窗口
imshow(pic); %显示图片
f1 = pic(:,:,1); %红色图
figure('Name','红色图'); %创建显示红色图的窗口
imshow(f1); %显示图片
f2 = pic(:,:,2); %绿色图
figure('Name','绿色图'); %创建显示绿色图的窗口
imshow(f2); %显示图片
f3 = pic(:,:,3); %蓝色图
figure('Name','蓝色图'); %创建显示蓝色图的窗口
imshow(f3); %显示图片
f_dif = f1 - f2 ;
figure('Name','红绿差值图'); %创建显示红绿差值图的窗口
imshow(f_dif); %显示图片
f_dif_min = min(min(f_dif)); %获得矩阵最小值
f_dif_max = max(max(f_dif)); %获得矩阵最大值
figure('Name','红绿差值图对比度图'); %创建显示红绿差值图对比度图的窗口
imshow(f_dif,[f_dif_min,f_dif_max]); %显示最好对比度图片
fprintf('hello,world\t--from DSH\n'); %彩蛋