文章目录
基础知识
第一次接触这方面的知识,一开始有点措手不及,过了很久才慢慢了解
图像是什么样的?
在matlab中使用imread()函数读取一副彩色图像后我们得到了以下的矩阵
在计算机中,图像就是以这种形式保存的。
1,空间分辨率,灰度分辨率
2,灰度图和彩色图的区别
3,什么是灰度直方图?
由此可见,进行灰度变换就是改变灰度值
实验要求
1,按照灰度变换曲线对图像进行灰度变换
2,读入一幅图像,分别对其进行求反变换、对数变换和幂次变换。并显示原图像和变换后图像。
实验记录
任务一:
%分段
x0=0;y0=0;
x1=48;y1=23;
x2=196;y2=216;
x3=255;y3=255;
%算变换斜率
a1=(y1-y0)/(x1-x0);
a2=(y2-y1)/(x2-x1);
a3=(y3-y2)/(x3-x2);
I2 = I1;
[height,width] = size(I1) %得出图片的高,宽
for row = 1:1:height %遍历图片矩阵
for col = 1:1:width
tmp = I2(row,col);
if(tmp < x1)
I2(row,col) = a1*tmp;
elseif(tmp>=x1&tmp<x2)
I2(row,col) = a2*(tmp-x1)+y1;
else
I2(row,col) = a3*(tmp-x2)+y2;
end
end
end
plot(x,y);
hold on
plot([0 x1],[y1 y1],'r--') %画线
plot([x1 x1],[0 y1],'r--') %画线
plot([0 x2],[y2 y2],'r--') %画线
plot([x2 x2],[0 y2],'r--') %画线
hold off
%分段
x0=0;y0=0;
x1=48;y1=23;
x2=196;y2=216;
x3=255;y3=255;
%算变换斜率
a1=(y1-y0)/(x1-x0);
a2=(y2-y1)/(x2-x1);
a3=(y3-y2)/(x3-x2);
I2 = I1;
[height,width] = size(I1) %得出图片的高,宽
for row = 1:1:height %遍历图片矩阵
for col = 1:1:width
tmp = I2(row,col);
if(tmp < x1)
I2(row,col) = a1*tmp;
elseif(tmp>=x1&tmp<=x2)
I2(row,col) = a2*(tmp-x1)+y1;
else
I2(row,col) = a3*(tmp-x2)+y2;
end
end
end
subplot(221);imshow(I1);title('灰度图');
subplot(222);imhist(I1);title('灰度直方图');
subplot(223);imshow(I2);title('灰度变换后图');
subplot(224);imhist(I2);title('灰度直方图');
任务二:
反转变换:
H=imread('山.png');
Hi = 255-H;
subplot(324);imshow(Hi);title('求反变换');
对数变换:
I=imread('山.png');
c = 1 %对数因子
I1 = im2double(I);
I3 = uint8(c*log(1+I1*255)/log(256)*255);
subplot(121);imshow(I);title('原图');
subplot(122);imshow(I3);title('对数变换图');
幂次变换:
gamma = 2.5; % 幂次参数,可根据需要调整
Hgam = c*im2double(H).^gamma;
subplot(326);imshow(Hgam);title('幂次变换');
结果展示
结果1:
结果2:
反转变换:
对数变换:
幂次变换:
反思,总结与收获
1,在matlab中让几幅图片在一个窗口显示
subplot(121);imshow(I);title('原图');
subplot(122);imshow(Hgam);title('幂次变换图');
subplot(a,b,c);
将窗口分割成a行b列后,这个图片在序号为c的位置
序号排序如下:
注意:subplot()
函数里面的参数要加,
分隔,我没有分隔,是坏习惯
2,title(’ ') 标题
在’'之间添加文本就可以显示标题了
3,uint8
图像矩阵的数据类型一般是uint8,无符号8位整型数据
4,im2double()函数
将图的uint8矩阵转成double矩阵,要注意的是,这个函数一般会将原来uint8数据从0~255范围映射到0~1范围,所以当你想把它重新转成uint8的时候要乘255
5,matlab判断语句怎么写
if(条件)
...
elseif(条件)
...
else
...
end
6,matlab 循环语句怎么写
for i = 1:7 %这个代表了从1到7,每次递增1
...
end
for i = 0:2:8 %这个代表了从0到8,每次递增2
...
end
7,清空命令行
% 在脚本里加入以下语句,在每次运行时会清空命令行
clear all;
clc;