2019-10-15 09:36:34 weixin_43262648 阅读数 180

Matlab遥感数字图像处理——统计值计算

clear,clc;   %清空工作区,清屏
result = IMG_Read('NVIS.dat');
% result = IMG_Read('Sandiego.img');
% result = IMG_Read('TM.dat');
% result = IMG_Read('can.dat');
% result = IMG_Read('TM-30m.dat');
% result = IMG_Read('Beijing.dat');

datatype = cell2mat(result(1));
Image = cell2mat(result(2));
[lines,samples,bands] = size(Image);

IMG = Image(:,:,1);        %只读取图像的一个波段
IMAGE = reshape(IMG,1,[]); %将二维矩阵转换为一维数组
IMGnum = samples*lines;

IMGsum = 0;
IMGVAR = 0;
IMGCOV = 0;

fid=fopen('统计结果.txt','w');

%求单波段数据的均值
IMGmean = mean(IMAGE)
% for i=1:IMGnum
%     IMGsum = IMGsum + IMAGE(i);
% end
% IMGmean = IMGsum/IMGnum;
fprintf(fid,'%7s %12s\r\n','统计量','统计值');
fprintf(fid,'%7s %17f\r\n','均值',IMGmean);

%对单波段数据排序
IMAGE1 = IMAGE;
IMAGE1 = sort(IMAGE1);
% for j = 1:IMGnum
%  for i = 1:IMGnum-j
%         if(IMAGE1(i)>IMAGE1(i+1))
%             temp = IMAGE1(i);
%             IMAGE1(i) = IMAGE1(i+1);
%             IMAGE1(i+1) = temp;
%         end
%     end
% end

% 求单波段数据的中值
IMGmedian = median(IMAGE1)
% if mod(IMGnum,2)==0
%     IMGmedian = (IMAGE1(IMGnum/2)+IMAGE1(IMGnum/2+1))/2;
% else 
%     IMGmedian = IMAGE1(fix(IMGnum/2));
% end
fprintf(fid,'%7s %17f\r\n','中值',IMGmedian);

%直方图统计
IMGmax = max(IMAGE1)
numbers = zeros(2,IMGmax);
for k = 1:IMGmax+1
    numbers(1,k) = k-1;  
    numbers(2,k)= 0;
end
for i = 1:samples*lines
        for k = 1:IMGmax+1
             if IMAGE1(1,i)== numbers(1,k)
                 numbers(2,k) = numbers(2,k)+1;
             end
        end
end

%累计直方图统计
NUMBER = zeros(2,fix(IMGmax));
NUMBER(2,1) = numbers(2,1);
for k = 2:IMGmax+1
    NUMBER(1,k) = k-1;  
    NUMBER(2,k) = NUMBER(2,k-1) + numbers(2,k); 
end

% 求单波段数据的众数
IMGmode = mode(IMAGE1(1,:))
fprintf(fid,'%7s %17f\r\n','众数',IMGmode);
% for i = 1:IMGmax
%     if(numbers(2,i)== max(numbers(2,:)))
%         IMGmode = i-1;
%     end
% end

% 求单波段数据的方差
IMGvar = var(IMAGE)
% for i = 1:IMGnum
%    IMGVAR = IMGVAR+ (IMAGE(i)-IMGmean) ^2;
% end
% IMGvar = IMGVAR/IMGnum
fprintf(fid,'%7s %17f\r\n','方差',IMGvar);

%前两个波段的协方差
IMG2 = Image(:,:,2);
IMAGE2 = reshape(IMG2,1,[]);
IMGcov = cov(IMAGE,IMAGE2)
% IMGmean2 = mean(IMAGE2);
% for i = 1:IMGnum
%    IMGCOV = IMGCOV+ (IMAGE(i)-IMGmean) * (IMAGE2(i)-IMGmean2);
% end
% IMGcov = IMGCOV/IMGnum
fprintf(fid,'%7s\r %16f %10f\r\n %26f %10f\r\n','协方差',IMGcov);

%前两个波段的相关系数
IMGcorrcoef = corrcoef(IMG,IMG2)
% TMGcorrcoef = IMGcov/((IMGvar^0.5)*(var(IMAGE2))^0.5)
fprintf(fid,'%7s\r %14f %10f\r\n %25f %10f\r\n','相关系数',IMGcorrcoef);
fclose(fid);

%绘制单波段数据的直方图
figure(2)
subplot(1,3,1);
hist(IMAGE1,IMGmax)
title('第一个波段灰度直方图');
% IMGhist = hist(IMAGE,IMGmax);

subplot(1,3,2);
hist(IMAGE2,max(IMAGE2));
title('第二个波段灰度直方图');
% IMGhist2 = hist(IMAGE2,max(IMAGE2));

subplot(1,3,3);
IMG3 = Image(:,:,3);
IMAGE3 = reshape(IMG3,1,[]);
hist(IMAGE3,max(IMAGE2))
title('第三个波段灰度直方图');
% IMGhist3 = hist(IMAGE3,max(IMAGE2));
2017-06-08 14:17:21 jidushanzhu 阅读数 11103

简单的界面实现的几个简单的功能,只支持JPG格式图像,还有很多需要改进的。


1、灰度化:提取jpg图像各个像素点的R、G、B三个类型的值,再对其进行加权平均。最后得到一个通道红绿蓝三个类型的加权平均。
公式为:ima=0.299*ima_red+0.587*ima_green+0.114*ima_blue。


2、二值化:二值化是在图像灰度化的基础上进行的,通过比较图像每个像素点的灰度值与阈值的大小关系来设置该点为0或1。


3、中值滤波:基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,一般为方形邻域,也可以为圆形、十字形等等,然后将邻域中各像素的灰度值排序,取其中间值作为中心像素灰度的新值,这里领域被称为窗口,当窗口移动时,利用中值滤波可以对图像进行平滑处理。其算法简单,时间复杂度低,但其对点、线和尖顶多的图像不宜采用中值滤波。本系统中值滤波设置的核为长宽都是6的正方形,在此邻域内来找中值。

4、低通滤波:在低通滤波中,低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。首先对图像进行傅里叶变换,接着将FFT的DC分量移到频谱中心,指定滤波器截止频率和滤波半径后,通过低通滤波转换函数与该频率进行比较d=sqrt((i-n1)^2+(j-n2)^2)。若信号大于该频率,则置为0。


5、均值滤波:均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个滤波核,该核包括了其周围的临近像素,再用核中的全体像素的平均值来代替原来像素值。在本项目中,需先给出设计的正方形核的边长,之后便可以用指定大小的滤波核进行均值滤波。

6、高斯滤波:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值用。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

7、形态学-腐蚀:一般腐蚀操作对二值图进行处理,腐蚀操作如左图,当像素点(i,j+1)和(i+1,j)为1时则(i,j)为1。腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的目标物。如果两目标物间有细小的连通,可以选取足够大的结构元素,将细小连通腐蚀掉。

8、直方图统计:灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。图像直方图由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域。

9、sobel:图像的边缘是灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。由于只采用2个方向的模板。

10、canny:Canny检测主要分为四个步骤。首先为防止噪声干扰,先对图像进行去噪。接着可按照sobel的方式来计算图像梯度的幅值和方向。由于梯度大的不一定就是边缘,可以通过每个像素点的方向来确定该像素点在此邻域范围内是否是最大值,若是,则保留该像素点,不是则舍弃。最后用双阈值法再剔除一部分像素点并连接边缘。


程序下载:http://download.csdn.net/detail/jidushanzhu/9864612


2019-09-02 15:01:18 weixin_44225182 阅读数 149

MATLAB–数字图像处理 采样

1、MATLAB软件安装后,点击进去,出现如下界面
其中右边空白区域(有fx那块区域),就是我们的编写代码的区域
左边就是工作区,有我们的一些变量值,上面就是软件的一些按钮,有一定的功能
在这里插入图片描述
2. 了解采样
首先,我们要知道采样是什么?
采样:我们获取到的图像一般为模拟图像,要让计算机进行处理需将其数字化,采样的作用就是将模拟图像转变为数字图像。一般来说,采样间隔越大,所得图像像素数越少,空间分辨率越低,质量差,严重时出现马赛克效应;采样间隔越小,所得图像像素数越多,空间分辨率越高,图像质量好,但数据量大。

简单的说,采样就是将图片数字化,采集的数字特征越多,其再计算机上显示的图像越逼真。

3、编写采样代码
首先准备一张图片,然后进入代码区域编写如下代码,按下Enter键,就有如下结果

t=imread('t1.jpg')   %读取图片
t1=rgb2gray(t)    %将图片灰度化
t2=t1(1:4:end,1:4:end) %采样
imshow(t2)  %显示在屏幕上

在这里插入图片描述

由于我也是才开始接触MATLAB和图像处理,有很多地方也还是不清楚。这里我说一下自己踩过的坑吧。

  1. 在MATLAB代码区换行是:shift+Enter
  2. 图片的路径有两种,一种是相对路径,一种是绝对路径。相对路径就是左边工作台有个路径,我们把图片存在这里,在编写代码的时候,就可以直接用图片的名字为路径(见下图,我们就直接存在bin这个目录下面就行)。第二种就是,输入图片在电脑存的路径,这个也好找,直接在文件里面就有在这里插入图片描述
  3. MATLAB默认只打开一个窗口,如果有2个imshow,只会出现第一imshow的内容,想要多个窗口,用figure。
  4. t2=t1(1:4:end,1:4:end) %采样 这句话的意思是,t2是计算机对t1横向、纵向都是每隔4的像素点取样,这样t2就会比t1更加模糊(采集的像素点少了)
  5. 有人会问,为什么一来要对图片进行灰度化处理呢? 这个是因为,一张图片,彩色的,有R、G、B三个通道的数据,也就是如果直接执行下面代码的话,会出现三种图片,对应R G B .t=imread('t1.jpg') t2=t(1:4:end,1:4:end) imshow(t2) 所以想要得到一张图片的话,就必须先进行灰度化处理。(这里我们图像处理都是先读取图片数据,读取的数据是以矩阵形式存在,矩阵的的值为灰度值,0~~255,没有彩色之分,所以彩色图片进来的话,系统会对r g b三个通道分别读取灰度值,也就形成了三张图片了。)
    在这里插入图片描述

完整代码及效果图:

t=imread('t1.jpg')
t1=rgb2gray(t)
imshow(t1),title('原图') %原图像 需要将其先转换为灰度图像
t2=t1(1:2:end,1:2:end)
t3=t1(1:4:end,1:4:end)
t4=t1(1:8:end,1:8:end)
t5=t1(1:16:end,1:16:end)
figure,subplot(2,2,1),imshow(t2),title('1:2采样')
subplot(2,2,2),imshow(t3),title('1:4采样')
subplot(2,2,3),imshow(t4),title('1:8采样')
subplot(2,2,4),imshow(t5),title('1:16采样')

在这里插入图片描述在这里插入图片描述

2019-08-25 22:48:35 y1132546 阅读数 141

数字图像处理——Matlab 学习笔记(灰度变换、直方图处理)

本文仅初学基于Matlab数字图像处理的学习笔记,为方便以后复习及查找代码所用

1 图像的输入和显示

f=imread('E:\Matl\image\tianya1.jpg');
imshow(f)
figure,imshow(g) #在另一个图像显示窗口显示另一张图像
imwrite(f,'tianya1.jpg','quality',100);  #将图像写入当前目录

2 灰度变换

imcomplement函数

g = imcomplement(f)  %获得照片负片  *负片变换*
imshow(g)

imadjust函数

g1 = imadjust(f,[0 1],[1 0]);   %获得照片负片  *负片变换*
figure,imshow(g1)
g2 = imadjust(f,[0.5 0.75],[0 1]);   %将0.5到0.75之间的灰度扩展到【0 1】整个范围  
figure,imshow(g2)
g3 = imadjust(f,[],[],2); %用gamma=2**图像增强**  空矩阵为默认值   *gamma变换*
figure,imshow(g3)
g4 = imadjust(f,stretchlim(f),[]);  %stretchlim(f)函数 可增强图像的对比度   *对比度变换*
figure,imshow(g4)
g5 = im2uint8(mat2gray(log(1+double(f)))); %对数变换,目的为保留频谱中低灰度值的细节部分 *对数变换*
figure,imshow(g5)

灰度变换
总结:g1负片;g2对比增强,强调图片明显的特征;g3压缩灰度的低端和高端;g4对比增强,比g2增强结果较小;

3 直方图处理

imhist(f); %默认直方图
figure,imshow(g)
figure,imhist(g)

默认直方图

从直方图中看出,整幅图较暗,直方图分布在偏灰度级的暗端,动态范围较低

3.1直方图均衡化

>> g = histeq(f,256);
>> figure,imshow(g)
>> figure,imhist(g)
>> ylim('auto')

直方图均衡化

2018-01-06 14:54:50 aninstein 阅读数 3889

数字图像处理实验1-9点击下列链接有源码和链接:


上一节已经简单介绍guide的使用,我们直接用,创建了这么一个界面:


1、打开图片代码:

% --- Executes on button press in openFile.
function openFile_Callback(hObject, eventdata, handles)
[filename,pathname]=uigetfile({'*.jpg'},'选择图片');%文件选择
str=[pathname filename];%被选择的文件路径
[handles.I,handles.map]=imread(str);%读取图片
in_image=[handles.I,handles.map];
handles.simage=handles.I;
guidata(hObject,handles);%图像串行化
axes(handles.axessmall);%把显示范围限定在axessmall
imshow(in_image);%显示图片
axes(handles.axesbig);%把显示范围限定在axesbig
imshow(in_image);%显示图片
2、重置图片的代码:

% --- Executes on button press in reset_photo.
function reset_photo_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
handles.I=handles.simage;
guidata(hObject,handles);%图像串行化

3、上下左右平移的代码:

(1)我们先写一个move函数:

%move平移函数,I为图像,a和b组成一个平移向量
function J=move(I,a,b)
[M,N,G]=size(I);
I=im2double(I);
J=ones(M,N,G);
for i=1:M
    for j=1:N
        if((i+a)>=1&&(i+a)<=M&&(j+b)>=1&&(j+b)<=N);%这里可以写判断图像超出范围的代码
           J(i+a,j+b,:)=I(i,j,:);
        end
    end
end
(2)使用move函数

% --- Executes on button press in 向上平移.
function translationup_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image=move(in_image,-10,0);
handles.I=in_image;
guidata(hObject,handles);%图像串行化
axes(handles.axesbig);%把显示范围限定在axesbig
imshow(in_image);%显示图片

% --- Executes on button press in 向下平移.
function translationdown_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image=move(in_image,10,0);
handles.I=in_image;
guidata(hObject,handles);%图像串行化
axes(handles.axesbig);%把显示范围限定在axesbig
imshow(in_image);%显示图片


% --- Executes on button press in 向左平移.
function translationleft_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image=move(in_image,0,-10);
handles.I=in_image;
guidata(hObject,handles);%图像串行化
axes(handles.axesbig);%把显示范围限定在axesbig
imshow(in_image);%显示图片


% --- Executes on button press in 向右平移.
function translationright_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image=move(in_image,0,10);
handles.I=in_image;
guidata(hObject,handles);%图像串行化
axes(handles.axesbig);%把显示范围限定在axesbig
imshow(in_image);%显示图片

4、放大缩小代码:通过imresize()函数对图像进行镜像转换

% --- Executes on button press in 放大.
function enlarge_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image2=imresize(in_image,2);
handles.I=in_image2;
guidata(hObject,handles);%图像串行化
figure,imshow(in_image);
figure,imshow(in_image2);


% --- Executes on button press in 缩小.
function narrow_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image2=imresize(in_image,0.5);
handles.I=in_image2;
guidata(hObject,handles);%图像串行化
figure,imshow(in_image);
figure,imshow(in_image2);

5、镜像代码:通过mirror()函数对图像进行镜像转换

(1)我们需要先写一个mirror函数

function OutImage=mirror(InImage,n)
%mirror函数实现图像镜像变换功能
%参数n为1时,实现水平镜像变换
%参数n为2时,实现垂直镜像变换
%参数n为3时,实现水平垂直镜像变换
I=InImage;
[M,N,G]=size(I);%获取输入图像I的大小
J=I;  %初始化新图像矩阵全为1,大小与输入图像相
if (n==1)
    for i=1:M
        for j=1:N
            J(i,j,:)=I(M-i+1,j,:);%n=1,水平镜像
        end
    end;
elseif (n==2)
     for i=1:M
        for j=1:N
            J(i,j,:)=I(i,N-j+1,:);%n=2,垂直镜像
        end
     end    
elseif (n==3)
     for i=1:M
        for j=1:N
            J(i,j,:)=I(M-i+1,N-j+1,:);%n=3,水平垂直镜像
        end
     end
else
    error('参数n输入不正确,n取值1、2、3')%n输入错误时提示
end
    OutImage=J;
(2)使用mirror函数

% --- Executes on button press in 镜像.
function mirror_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image2=mirror(in_image,1);% 镜像函数是一个比较古老的函数,虽然现在还可以用,但是这个函数已经被matlab淘汰了
handles.I=in_image2;
guidata(hObject,handles);%图像串行化
figure,
subplot(1,2,1),imshow(in_image);
subplot(1,2,2),imshow(in_image2);
6、图像的转置:

(1)我们需要先写一个转置函数

function J=transp(I)
%I表示输入的原始图像
%J表示经过转置以后的图像
[M,N,G]=size(I);%获取输入图像I的大小
I=im2double(I); %将图像数据类型转换成双精度
J=ones(N,M,G);  %初始化新图像矩阵全为1,大小与输入图像相同
for i=1:M
    for j=1:N
      J(j,i,:)=I(i,j,:);%进行图像转置    
    end
end

(2)使用转置函数

% --- Executes on button press in overturn.
function overturn_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image2=transp(in_image);
handles.I=in_image2;
guidata(hObject,handles);%图像串行化
figure,
subplot(1,2,1),imshow(in_image);
subplot(1,2,2),imshow(in_image2);
7、图像的旋转:

% --- Executes on button press in 顺时针旋转.
function rotateCW_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image2=imrotate(in_image,-20,'nearest','crop');%顺时针逆时针只是第二个参数的符号不同
handles.I=in_image2;
guidata(hObject,handles);%图像串行化
figure,
subplot(1,2,1),imshow(in_image);
subplot(1,2,2),imshow(in_image2);


% --- Executes on button press in 逆时针旋转.
function rotateACW_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
in_image2=imrotate(in_image,20,'nearest','crop');%顺时针逆时针只是第二个参数的符号不同
handles.I=in_image2;
guidata(hObject,handles);%图像串行化
figure,
subplot(1,2,1),imshow(in_image);
subplot(1,2,2),imshow(in_image2);

8、图像截取某一部分:(这里是可以通过捕捉鼠标移动的方式来做一个简单截图软件的)

% --- Executes on button press in 图像的剪切.
function cut_Callback(hObject, eventdata, handles)
handles=guidata(hObject);
in_image=[handles.I,handles.map];
rect=[0 300 200 300];           %定义剪切区域
in_image2=imcrop(in_image,rect);              %进行图像剪切
set(0,'defaultFigurePosition',[100,100,1000,500]);%修改图形图像位置的默认设置
set(0,'defaultFigureColor',[1 1 1])%修改图形背景颜色的设置
axes(handles.axesbig);%把显示范围限定在axesbig
imshow(in_image2);%显示图片







没有更多推荐了,返回首页