MATLAB实现遥感图像预处理——图像变换

前言

这些代码均是使用最基础的方法,通过一步一步迭代过程来理解算法的原理及实现过程,并不采用于实用工程,读者以此作为学习参考即可。

图像变换

读取遥感图像,以测绘卫星获取的光学遥感图像为例:

1、图像变换:

MATLAB实现遥感图像预处理——图像变换_第1张图片
(1)图像反转:
在这里插入图片描述
(2)对数变换:
在这里插入图片描述
(3)幂次变换:
在这里插入图片描述
在这里插入图片描述

2、使用算数、逻辑操作进行增强,在两幅或多幅图之间进行。

(1)二值图像操作
从一幅图像中提取子图像,例如,提取体育馆的图像,其他区域变为黑色背景。
(2)两幅图像的差异图像
求比值、求差值、变化检测。

运行结果

1、变换函数的曲线图像

(1)二值变换函数与反转变换函数图像

MATLAB实现遥感图像预处理——图像变换_第2张图片
变换函数函数分析:二值化函数是将图像中小于设定阈值的灰度值全部设为0,大于等于阈值的设定为255,使图像中仅存在黑和白两种颜色,灰度值只有0和255。反转变换是将图像中灰度值高的部分变低,灰度值低的地方变高,将图像中亮的部分与暗的部分交换。

(2)不同系数的对数变换函数图像

MATLAB实现遥感图像预处理——图像变换_第3张图片
变换函数分析:对数变换函数会将输入图像的灰度值中较暗部分映射到较大的范围去,而较亮部分则会映射到较小的区域。这个函数会将图像暗处的细节放大,压缩亮处的细节。

(3)不同系数以及不同指数幂次变换函数图像

MATLAB实现遥感图像预处理——图像变换_第4张图片
MATLAB实现遥感图像预处理——图像变换_第5张图片
变换函数分析:当指数b<1时,效果和对数函数相似,放大暗处细节,压缩亮处细节,随着数值减少,效果越强;而当指数b>1时,放大亮处细节,压缩暗处细节,随着数值增大,效果越强。

2、图像处理结果

(1)图像反转变换结果及分析

MATLAB实现遥感图像预处理——图像变换_第6张图片
分析:从上图可以看出,原图中黑色的部分变成了白色,而白色则变成了黑色,灰度值处于中间的部分也对称反转,原图中白色的部分变得更为清晰.

(2)图像对数变换结果及分析

MATLAB实现遥感图像预处理——图像变换_第7张图片
分析:对数变换将图像中较暗的部分映射到大范围,亮的部分压缩到很小的范围,突出较暗部分的细节,图像整体偏亮。其中系数c则影响了变换后图像的整体亮度,c越大,图像越亮。

(3)图像幂次变换结果及分析

MATLAB实现遥感图像预处理——图像变换_第8张图片
分析:当指数b<1时,效果和对数函数相似,放大暗处细节,压缩亮处细节,随着数值减少,效果越强;而当指数b>1时,放大亮处细节,压缩暗处细节,随着数值增大,效果越强,图像整体看起来更加偏暗。

3、使用算数、逻辑操作进行增强

(1)提取子图像

先设立一个与原图大小相同的模板图,其中对感兴趣部分处的值设定为1,其余部分为背景部分,取值为0。然后通过算术运算将模板图与原图对应相乘,提取出子图像。
MATLAB实现遥感图像预处理——图像变换_第9张图片

(2)求差值

MATLAB实现遥感图像预处理——图像变换_第10张图片
上述处理步骤:将原图像1进行二次变换,原图像2进行0.3次变换,然后用原图1减去原图2,将相减后的图像归一化,然后设定阈值为0.72,进行二值化处理,得到的图像再经过3*3的方块进行开操作,得到最终结果。

源代码

clc;
clearvars
close all;

x=0:0.01:255;
y1=0.*(x>=0&x<128)+255.*(x>=128&x<=255);
y2=256-1-x;
figure(1)
subplot(2,1,1),plot(x,y1);title('二值化变换函数图像');xlabel('r');ylabel('s');
subplot(2,1,2),plot(x,y2);title('反转变换函数图像');xlabel('r');ylabel('s');

x=0:0.01:255;
y3=1*log(x+1);
y4=2*log(x+1);
y5=5*log(x+1);
figure(2)
subplot(1,1,1),plot(x,y3);title('不同系数c对数变换函数图像');xlabel('r');ylabel('s');hold on;
plot(x,y4);hold on;
plot(x,y5);
legend('系数为1的对数变换函数图像','系数为2的对数变换函数图像','系数为5的对数变换函数图像');
%改变参数c
x=0:0.01:1;
y6=1*x.^2;
y7=2*x.^2;
y8=5*x.^2;
figure(3)
subplot(1,1,1),plot(x,y6);title('不同系数c幂次变换函数图像');xlabel('r');ylabel('s');hold on;
plot(x,y7);hold on;
plot(x,y8);
legend('系数为1的2次变换函数图像','系数为2的2次变换函数图像','系数为5的2次变换函数图像');
%改变参数b
x=0:0.01:1;
y9=1*x.^2;
y10=1*x.^1;
y11=1*x.^0.5;
y12=1*x.^0.25;
y13=1*x.^4;
figure(4)
subplot(1,1,1),plot(x,y9);title('同系数不同幂次b变换函数图像');xlabel('r');ylabel('s');hold on;
plot(x,y10);hold on;
plot(x,y11);hold on;
plot(x,y12);hold on;
plot(x,y13);
legend('系数为1的2次变换函数图像','系数为1的1次变换函数图像','系数为1的0.5次变换函数图像','系数为1的0.25次变换函数图像','系数为1的4次变换函数图像');

%图像处理
Im1 = imread('ygtx.jpg');
Im2 = rgb2gray(Im1);
[xxx,yyy,z]=size(Im2);
figure(5)
subplot(2,1,1),imshow(Im1),title('原图像');
subplot(2,1,2),imshow(Im2),title('原图像灰度图');
%图像反转
figure(6)
subplot(2,1,1),imshow(Im2),title('原图像灰度图');
fanzhuan=zeros(xxx,yyy);
fanzhuan=256-1-Im2;
subplot(2,1,2),imshow(fanzhuan,[]),title('原图像反转图');
%对数变换
ds=double(Im2);
figure(7)
subplot(2,2,1),imshow(Im2),title('原图像灰度图');
duishu1=zeros(xxx,yyy);
duishu1=1*log(ds+1);
subplot(2,2,2),imshow(duishu1,[]),title('系数为1的对数变换后图像');
duishu2=zeros(xxx,yyy);
duishu2=0.0005*log(ds+1);
subplot(2,2,3),imshow(duishu2,[]),title('系数为0.0005的对数变换后图像');
duishu3=zeros(xxx,yyy);
duishu3=50000*log(ds+1);
subplot(2,2,4),imshow(duishu3,[]),title('系数为50000的对数变换后图像');
%duishuc=duishu3-duishu2;
%figure(8)
%imshow(duishuc);
%幂次变换
mc=double(Im2);
figure(9)
subplot(2,2,1),imshow(Im2),title('原图像灰度图');
mici1=zeros(xxx,yyy);
mici1=1*mc.^0.5;
subplot(2,2,2),imshow(mici1,[]),title('系数为1的0.5次变换后图像');
mici2=zeros(xxx,yyy);
mici2=1*mc.^2;
subplot(2,2,3),imshow(mici2,[]),title('系数为1的2次变换后图像');
mici3=zeros(xxx,yyy);
mici3=1*mc.^4;
subplot(2,2,4),imshow(mici3,[]),title('系数为1的4次变换后图像');

%提取子图像
tq=zeros(xxx,yyy);
for i=120:190
    for j=330:520
        tq(i,j)=1;
    end
end
tq1=zeros(xxx,yyy);
for i=1:xxx
    for j=1:yyy
        tq1(i,j)=Im2(i,j)*tq(i,j);
    end
end
figure(10)
subplot(2,2,1),imshow(Im2),title('原图像灰度图');
subplot(2,2,2),imshow(tq,[]),title('提取模板图');
subplot(2,2,3),imshow(tq1,[]),title('提取子图');
%求图像差异
san11=imread('san_1.bmp');
san22=imread('san_2.bmp');
san3=imread('san_gt.bmp');
san2=mat2gray(double(san22));
san1=mat2gray(double(san11));
san1=san1.^2;
san2=san2.^0.3;
[xx,yy,zz]=size(san11);
sangt=san1-san2;
sangt=mat2gray(sangt);
sangt1=zeros(xx,yy);
for i=1:xx
    for j=1:yy
        if sangt(i,j)>=0.72
            sangt1(i,j)=1;
        else
            sangt1(i,j)=0;
        end
    end
end
se2=strel('square',3);
sangt2=imopen(sangt1,se2);
figure(11)
subplot(3,2,1),imshow(san11),title('原图像1');
subplot(3,2,2),imshow(san22),title('原图像2');
subplot(3,2,3),imshow(san3),title('标准差结果');
subplot(3,2,4),imshow(sangt),title('差值结果');
subplot(3,2,5),imshow(sangt2,[]),title('差值处理结果');


最开始写的代码比较随意,图片也是随意找的,没有注释,给大家磕了。

你可能感兴趣的:(遥感专业实验学习日志,matlab,算法,图像处理)