基于MATLAB的数字图像处理系统GUI界面设计
图像读入
Syntax: A = imread(filename, fmt)
filename:指定的灰度或彩色图像文件的完整路径和文件名。
fmt:指定图形文件的格式所对应的标准扩展名。如果imread没有找到filename所制定的文件,会尝试查找一个名为filename.fmt的文件。
A:包含图像矩阵的矩阵。对于灰度图像,它是一个M行N列的矩阵。如果文件包含 RGB真彩图像,则是m*n*3的矩阵。
X:图像数据矩阵。
MAP:颜色索引表
图像的显示
imshow(I) %I是要现实的灰度图像矩阵
imshow(I,[low high],param1, val1, param2, val2,...) %I是要现实的灰度图像矩阵,指定要显示的灰度范围,后面的参数指定显示图像的特定参数
imshow(RGB)
imshow(BW)
imshow(X,map) %map颜色索引表
imshow(filename)
himage = imshow(...)
I=imread('C:\Users\fanjinfei\Desktop\baby.bmp');%读取图像数据
imshow(I);%显示原图像
图像增强
一.图像的全局描述
直方图(Histogram):是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。
图像直方图(Image Histogram):是表示数字图像中亮度分布的直方图,用来描述图象灰度值,标绘了图像中每个亮度值的像素数。
灰度直方图:是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。描述了一幅图像的灰度级统计信息。是一个二维图,横坐标为图像中各个像素点的灰度级别,纵坐标表示具有各个灰度级别的像素在图像中出现的次数或概率。
归一化直方图:直接反应不同灰度级出现的比率。纵坐标表示具有各个灰度级别的像素在图像中出现的概率。
图像的灰度直方图:是一个离散函数,表示图像每一灰度级与该灰度级出现概率的对应关系。
图像的灰度直方图运算: imhist()函数,其横坐标表示像素的灰度级别,纵坐标为像素点的个数。
注意:若调用时不接受这个函数的返回值,则直接显示直方图;在得这些返回数据之后,也可以使用stem(x,counts)手绘直方图。
I=imread('C:\Users\fanjinfei\Desktop\baby.bmp');%读入图像
imhist(I) %显示图像的灰度直方图
I=imread('C:\Users\fanjinfei\Desktop\baby.bmp');%读入图像
figure;
imshow(I); %显示原始图像
title('source');
figure;
imhist(I); %显示图像的灰度直方图
title('graph');
注意:这里显示的是未经归一化的灰度直方图,纵轴表示图像中所有像素取到某一特定灰度值的次数,横轴表示所有灰度值。
I=imread('C:\Users\fanjinfei\Desktop\baby.bmp'); %读入原图像
figure; %打开新窗口
[M,N]=size(I); %计算图像大小
[counts,x] = imhist(I,32) ; %计算有32个小区间的灰度直方图
counts=counts/M/N; %计算归一化灰度直方图各区间的值
stem(x,counts) %绘制归一化直方图
注意:counts保存了落入每个区间的像素个数.
图像归一化:就是将图像转换成唯一的标准形式,消除同类图像不同变形体之间的外观差异。
二.直方图均衡化
目的:通过某种灰度映射,使输入图像转换为在每个灰度级上都具有近似相同的像素点数的输出图像。(输出的直方图均匀)
结果:使图像具有较高的对比度和较大的动态范围。
I=imread('C:\Users\fanjinfei\Desktop\baby.bmp');%读入图像
I=im2double(I);
%对比度变大的图像
I1=2*I-55/255;
subplot(4,4,1);
imshow=(I1);
subplot(4,4,2);
imhist=(I1);
subplot(4,4,3);
imshow=(histeq(I1));
subplot(4,4,4);
imhist=(histeq(I1));
一.滤波操作:【相关函数imfilter和fspecial】
1.函数imfilter:完成滤波操作。
f:进行滤波操作的图像;
w:滤波操作使用的模版,为一个二维数组;
option1,option2,...:可选项。
返回值:g为滤波后输出的图像。
【其中可选项:
‘replicate’:填充虚拟边界的内容总是重复与它最近的边缘像素。
‘corr’:相关
‘conv’:卷积】
f=imread('C:\Users\fanjinfei\Desktop\baby.bmp');%读入图像
figure;
imshow(f);
w=[1 1 1 ;1 1 1;1 1 1;1 1 1]/9
g=imfilter(f,w,'corr','replicate');%l滤波
figure;
figure,imshow(g);
2.函数fspecial:为我们创建一些预定义的2维滤波器,直接供函数imfilter使用。
type:指定滤波器类型。如’average’:平均模版
parameters:可选项。
返回值:h为特定滤波器。
subplot=Create axes in tiled positions建立坐标轴
Syntax:subplot(m,n,p)
im2double=Convert image to double precision将图像转换成双精度
Syntax:
I2 = im2double(I)
RGB2 = im2double(RGB)
I = im2double(BW)
X2 = im2double(X,'indexed')
注意:
I=imread('C:\Users\fanjinfei\Desktop\picture.png');%读取图像数据
n=length(I);
figure;
imshow('I');%显示原图像
%产生噪声图像
theta_noise=15;%噪声方差(可设为其他值)-------------------------------------------
%noise_sig_truth = 20; % sigma_n used in the paper. This parameter is adjusted by the user.
noise_mu = 0;
noise=randn(size(I)) .* theta_noise + noise_mu;
Inoise=double(I) + noise;
figure;
imshow(Inoise,[]);%显示带噪图像
%小波滤波器选择 这个是调用滤波器函数,但是仿真出错
qmf=MakeONFilter('Daubechies',8);%Daubechies8小波(可设为其他小波)-----------------
L=5;%分解层数=log2(n)-L
[InoiseNorm,coef] = NormNoise2(Inoise,qmf);%归一化,这个一直出现问题是怎么回事?
wc=FWT2_PO(InoiseNorm,L,qmf);%这个也没有
%--------------------------VisuShrink方法-----------------------------------------
%wc = MultiVisu2(wc,L);
%---------------------------------------------------------------------------------
%--------------------------SUREShrink方法-----------------------------------------
wc = MultiSURE2(wc,L);
图像去噪
canny边缘检测
I=imread('lena.bmp'); %读灰度图lena.bmp
%Canny edge detector
th=[0.05 0.2];
E=edge(I,'canny',th);
E=uint8(255*(1-double(E)));
figure('name','canny'),imshow(uint8(E),'truesize');
sobel边缘检测
I=imread('lena.bmp'); %读灰度图lena.bmp
%sobel edge detector
E=edge(I,'sobel',0.08);
E=uint8(255*(1-double(E)));
figure('name','canny'),imshow(uint8(E),'truesize');
练习:
%读取原始图像
I=imread('C:\Users\fanjinfei\Desktop\picture.png');%读取图像数据
n=length(I);
figure;
imshow(I),title('原图') %显示原图像
%缩小图像
J = imresize(I,0.5);%将图像缩小至0.5倍
figure;
imshow(J),title('0.5 倍图') %显示缩小后的图像
%显示尺寸
[mrows,mcols] = size(I) %查看原始的尺寸大小
[mrows,mcols] = size(J) %查看缩放图像的尺寸大小
%放大图像
K= imresize(I,1.5); %将图像放大 1.5 倍
figure;
imshow(K),title('1.5 倍图') %显示放大后的图像
%设置尺寸
M = imresize(I,[250,600]);%设置图像的尺寸大小
figure;
imshow(M),title('250*600 图')
%逆时针旋转图像
I45 = imrotate(I, 45);%对图像逆时针旋转 45 度
figure;
imshow(I45),title('逆时针 45 度') %显示逆时针旋转后的图像
%逆时针旋转图像
I45 = imrotate(I, -45);
figure;
imshow(I45),title('顺时针 45 度')
%对图像逆时针旋转 180 度,即反转
IR = imrotate(i, 180);
figure;
imshow(iR),title('反转')
%裁剪图像,读入图像文件,然后调用命令,进入裁剪阶段。【没完成】
I=imread('C:\Users\fanjinfei\Desktop\picture.png');%读取图像数据
n=length(I);
figure;
imshow(I),title('原图') %显示原图像
I_crop = imcrop(I) %会显示进入裁剪界面
Imshow(I_crop),title('裁剪后') %显示裁剪的图像
图像的灰度变换
I=imread('C:\Users\fanjinfei\Desktop\picture.png');%读取图像数据
figure;
imshow(I),title('原图') %显示原图像
imhist(I)
图像去雾
close all clcrgb=imread('image processing\fog\fog.jpg');% 对饱和度与亮度进行histeq处理hsv=rgb2hsv(rgb);h=hsv(:,:,1);s=hsv(:,:,2);v=hsv(:,:,3);S=histeq(s);V=histeq(v);result_hsv=hsv2rgb(h,S,V);% 对YCbCr的亮度进行histeq处理ycbcr=rgb2ycbcr(rgb);y=ycbcr(:,:,1);cb=ycbcr(:,:,2);cr=ycbcr(:,:,3);Y=histeq(y);result_ycbcr=ycbcr2rgb(cat(3,Y,cb,cr));% 结果显示figuresubplot(2,2,1),imshow(rgb),title('原始图像')subplot(2,2,2),imshow(result_hsv),title('HSV')subplot(2,2,3),imshow(result_rgb),title('RGB')subplot(2,2,4),imshow(result_ycbcr),title('YCbCr') |