全世界数以百万计的工程师和科学家都在使用 MATLAB 分析和设计改变着我们的世界的系统和产品。基于矩阵的 MATLAB 语言是世界上表示计算数学最自然的方式。可以使用内置图形轻松可视化数据和深入了解数据。欢迎您使用桌面环境进行试验、探索和发现。这些 MATLAB 工具和功能全部进行了严格测试,可彼此配合工作。
MATLAB 可帮助您不仅仅将自己的创意停留在桌面。您可以对大型数据集运行分析,并扩展到群集和云。MATLAB 代码可以与其他语言集成,使您能够在 Web、企业和生产系统中部署算法和应用程序。
图像数据,其实就是一个一个像素点的像素值组成的矩阵,可以说是二维矩阵,也可以说是三维矩阵。大多数图像表示为二维数组(矩阵),其中矩阵的每个元素对应所显示图像的一个像素。例如,由 200 行和 300 列不同颜色的点组成的图像保存为一个 200×300 的矩阵。有些图像,如 RGB,需要三维数组,其中三个维度的第一个平面表示红色像素强度,第二个平面表示绿色像素强度,第三个平面表示蓝色像素强度。
MATLAB 数学支持三种不同的数值类用于图像显示:
描述图像中每个像素的数据所占的位数。图像的每一个像素对应的数据通常可以是1位(bit)或多位字节,用于存放该像素的颜色、亮度等信息,数据位数越多,对应的图像颜色种类越多。
(MATLAB严格区分大小写)
1、读取示例图
A = imread(‘filename’)
从 filename 指定的文件读取图像,并从文件内容推断出其格式。如果 filename 为多图像文件,则 imread 读取该文件中的第一个图像。
image(A)
3、提取RGB
[X,cmap] = imread(‘corn.tif’);
imshow(X,cmap)
A=rand(50);
imwrite(A,‘filename’)
将一个 50×50 的灰度值数组写入当前文件夹中的 JPG 文件。会发现文件夹中多了一个50×50的灰度图片。
一幅图像包括目标物体、 背景,甚至还有噪声。怎样从灰度值多变的图像中只提取感兴趣的目标信息, 最常用的方法就是设定某一阈值T,用T将图像的数据分成两大部分:大于T的像素群和小于T的像素群。这是研究灰度变换最特殊的方法,称为图像的二值化(binarization)。
二值化处理就是把图像分成目标和背景两个领域。
表示原始图像在(x,y)处的像素值
r = f(x,y)
表示灰度变换后的图像在(x,y)处的像素值
s = g(x,y)
基本的图像变换表示为:
s = T( r )
T(r)被称为灰度变换函数
突出感兴趣目标所在的灰度区间,相对抑制那些不感兴趣的灰度空间
由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升,所以就可以增强图像的暗部细节。
对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:
x轴的0.4大约对应了y轴的0.8,即原图上0 ~ 0.4 的低灰度部分经过对数运算后扩展到0 ~ 0.8的部分,而整个0.4 ~ 1的高灰度部分被投影到只有0.8~1的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。
灰度直方图是灰度级的函数,是对图像中灰度级分布的统计,反映的是一幅图像中各灰度级像素出现的频率。横坐标表示灰度级,纵坐标表示图像中对应某灰度级所出现的像素个数,也可以是某一灰度值的像素数占全图像素数的百分比,即灰度级的频率。
注意:图像与直方图是一对一关系,但是直方图与图像并非一对一关系
直方图均衡化原理是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像:
变换函数 T(*) 必须满足两个条件:
(a) : T 在区间[0, L-1]上是一个严格单调递增函数
(b) : T 在区间[0, L-1]上满足 0<=T<=L-1
在MATLAB中,有自动实现直方图均衡化的函数——histeq;
I = imread(‘tire.tif’);
Enhance the contrast of an intensity image using histogram equalization.
J = histeq(I);
Display the original image and the adjusted image.
imshowpair(I,J,‘montage’)
axis off
Display a histogram of the original image.
figure
imhist(I,64)
Display a histogram of the processed image.
figure
imhist(J,64)
根据直方图均衡化的原理,我们自己编写两个脚本实现灰度变换
方法一:
clc;
img=imread('C:\Users\zhao\Desktop\hnulearn\image2.jpg');
subplot(321);
imshow(img);
title('原始图像');
[x,y]=size(img);
img_man=zeros(x,y);
img_com=zeros(x,y);
Max=max(max(img));
Min=min(min(img));
Hist=zeros(1,256);
for i=1:x
for j=1:y
Hist(img(i,j)+1)=Hist(img(i,j)+1)+1;
end
end
subplot(322);
plot(Hist);
title('原始直方图');
p=zeros(1,256);
for i=1:256
p(i)=Hist(i)/(x*y);
end
c=zeros(1,256);
for i=1:256
c(i)=sum(p(1:i));
end
for i=1:x
for j=1:y
img_man(i,j)=c(img(i,j))*(Max+Min);
end
end
subplot(323);
imshow(uint8(img_man))
title('实现函数-图像');
Hist2=zeros(1,256);
for i=1:x
for j=1:y
Hist2(img_man(i,j)+1)=Hist2(img_man(i,j)+1)+1;
end
end
subplot(324);
plot(Hist2);
title('实现函数-直方图');
img_com=histeq(img);
subplot(325);
imshow(img_com)
title('自带函数-图像');
Hist3=zeros(1,256);
for i=1:x
for j=1:y
Hist3(img_com(i,j)+1)=Hist3(img_com(i,j)+1)+1;
end
end
subplot(326);
plot(Hist3);
title('自带函数-直方图');
方法二:
I = imread('C:\Users\zhao\Desktop\hnulearn\image2.jpg');
[row,col] = size(I);
img_com=histeq(I);
subplot(321);
imshow(img_com)
title('自带函数-图像');
Hist3=zeros(1,256);
for i=1:x
for j=1:y
Hist3(img_com(i,j)+1)=Hist3(img_com(i,j)+1)+1;
end
end
subplot(322);
plot(Hist3);
title('自带函数-直方图');
%display the original image
subplot(323);imshow(I);title('原始图像');
%Compute the PMF of all pixels of the image
PMF = zeros(1,256);
for i = 1:row
for j = 1:col
PMF(I(i,j) + 1) = PMF(I(i,j) + 1) + 1;
end
end
subplot(324);
plot(PMF);
title('原始直方图');
%Compute the CDF of all pixels of the image
CDF = zeros(1,256);
CDF(1) = PMF(1);
for i = 2:256
CDF(i) = CDF(i - 1) + PMF(i);
end
%Mapping
for i = 1:256
Map(i) =round((CDF(i)-1)*255/(row*col));
end
%subplot(324);plot(Map);title('map');
for i = 1:row
for j = 1:col
I(i,j) = Map(I(i,j) + 1);
end
end
subplot(325);imshow(I);title('处理后图像');
Hist = zeros(1,256);
for i = 1:row
for j = 1:col
Hist(I(i,j) + 1) = Hist(I(i,j) + 1) + 1;
end
end
subplot(326);
plot(Hist);
title('处理后图像');