MATLAB图形图像处理——图像灰度变换

MATLAB图形图像处理——图像灰度变换

  • 一、MATLAB入门知识
    • 1、什么是MATLAB
    • 2、MATLAB处理图像
      • 图像数据
      • 数据类型
      • 位深
      • 函数
        • imread
        • imwrite
  • 二、图像灰度变换基础知识
    • 1、二值化与阈值处理
      • 非零元素取一法
      • 固定阈值法
      • 双固定阈值法
    • 2、基本的灰度变换
      • 基本表示
      • 线性灰度变换
        • 图像反转
        • 正比类型的线性变换
        • 分段线性变换
      • 非线性灰度变换
    • 3、直方图均衡化
  • 三、变换操作

一、MATLAB入门知识

1、什么是MATLAB

全世界数以百万计的工程师和科学家都在使用 MATLAB 分析和设计改变着我们的世界的系统和产品。基于矩阵的 MATLAB 语言是世界上表示计算数学最自然的方式。可以使用内置图形轻松可视化数据和深入了解数据。欢迎您使用桌面环境进行试验、探索和发现。这些 MATLAB 工具和功能全部进行了严格测试,可彼此配合工作。

MATLAB 可帮助您不仅仅将自己的创意停留在桌面。您可以对大型数据集运行分析,并扩展到群集和云。MATLAB 代码可以与其他语言集成,使您能够在 Web、企业和生产系统中部署算法和应用程序。

2、MATLAB处理图像

图像数据

图像数据,其实就是一个一个像素点的像素值组成的矩阵,可以说是二维矩阵,也可以说是三维矩阵。大多数图像表示为二维数组(矩阵),其中矩阵的每个元素对应所显示图像的一个像素。例如,由 200 行和 300 列不同颜色的点组成的图像保存为一个 200×300 的矩阵。有些图像,如 RGB,需要三维数组,其中三个维度的第一个平面表示红色像素强度,第二个平面表示绿色像素强度,第三个平面表示蓝色像素强度。

数据类型

MATLAB 数学支持三种不同的数值类用于图像显示:

  • 双精度浮点数(double)
  • 16 位无符号整数(uint16)
  • 8 位无符号整数(uint8)
    图像通常使用double型数据类型,但是double对于像素点巨大的图像不友好,占用内存过多。
    为了减小内存需求,可以将图像数据存储在 uint8 和 uint16 这两类数组中。这些数组中的数据存储为 8 位或 16 位无符号整数。同样的数据,这些数组只需要 double 数组的八分之一或四分之一的存储容量。

位深

描述图像中每个像素的数据所占的位数。图像的每一个像素对应的数据通常可以是1位(bit)或多位字节,用于存放该像素的颜色、亮度等信息,数据位数越多,对应的图像颜色种类越多。

函数

(MATLAB严格区分大小写)

imread

1、读取示例图

A = imread(‘filename’)

从 filename 指定的文件读取图像,并从文件内容推断出其格式。如果 filename 为多图像文件,则 imread 读取该文件中的第一个图像。

filename:
MATLAB图形图像处理——图像灰度变换_第1张图片
2、显示图像

image(A)

3、提取RGB

[X,cmap] = imread(‘corn.tif’);
imshow(X,cmap)

imwrite

A=rand(50);
imwrite(A,‘filename’)

将一个 50×50 的灰度值数组写入当前文件夹中的 JPG 文件。会发现文件夹中多了一个50×50的灰度图片。
MATLAB图形图像处理——图像灰度变换_第2张图片

二、图像灰度变换基础知识

1、二值化与阈值处理

一幅图像包括目标物体、 背景,甚至还有噪声。怎样从灰度值多变的图像中只提取感兴趣的目标信息, 最常用的方法就是设定某一阈值T,用T将图像的数据分成两大部分:大于T的像素群和小于T的像素群。这是研究灰度变换最特殊的方法,称为图像的二值化(binarization)。
二值化处理就是把图像分成目标和背景两个领域。

非零元素取一法

MATLAB图形图像处理——图像灰度变换_第3张图片

固定阈值法

MATLAB图形图像处理——图像灰度变换_第4张图片

双固定阈值法

MATLAB图形图像处理——图像灰度变换_第5张图片

2、基本的灰度变换

基本表示

表示原始图像在(x,y)处的像素值

r = f(x,y)

表示灰度变换后的图像在(x,y)处的像素值

s = g(x,y)

基本的图像变换表示为:

s = T( r )

T(r)被称为灰度变换函数

线性灰度变换

图像反转

MATLAB图形图像处理——图像灰度变换_第6张图片

正比类型的线性变换

MATLAB图形图像处理——图像灰度变换_第7张图片

分段线性变换

突出感兴趣目标所在的灰度区间,相对抑制那些不感兴趣的灰度空间
MATLAB图形图像处理——图像灰度变换_第8张图片
MATLAB图形图像处理——图像灰度变换_第9张图片
MATLAB图形图像处理——图像灰度变换_第10张图片

MATLAB图形图像处理——图像灰度变换_第11张图片
MATLAB图形图像处理——图像灰度变换_第12张图片

非线性灰度变换

MATLAB图形图像处理——图像灰度变换_第13张图片
由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升,所以就可以增强图像的暗部细节。

对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:

MATLAB图形图像处理——图像灰度变换_第14张图片

x轴的0.4大约对应了y轴的0.8,即原图上0 ~ 0.4 的低灰度部分经过对数运算后扩展到0 ~ 0.8的部分,而整个0.4 ~ 1的高灰度部分被投影到只有0.8~1的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。

MATLAB图形图像处理——图像灰度变换_第15张图片

3、直方图均衡化

灰度直方图是灰度级的函数,是对图像中灰度级分布的统计,反映的是一幅图像中各灰度级像素出现的频率。横坐标表示灰度级,纵坐标表示图像中对应某灰度级所出现的像素个数,也可以是某一灰度值的像素数占全图像素数的百分比,即灰度级的频率。
MATLAB图形图像处理——图像灰度变换_第16张图片
注意:图像与直方图是一对一关系,但是直方图与图像并非一对一关系
直方图均衡化原理是将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像:

MATLAB图形图像处理——图像灰度变换_第17张图片
变换函数 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

MATLAB图形图像处理——图像灰度变换_第18张图片

Display a histogram of the original image.

figure
imhist(I,64)

MATLAB图形图像处理——图像灰度变换_第19张图片

Display a histogram of the processed image.

figure
imhist(J,64)

MATLAB图形图像处理——图像灰度变换_第20张图片

根据直方图均衡化的原理,我们自己编写两个脚本实现灰度变换

方法一:

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('自带函数-直方图');

MATLAB图形图像处理——图像灰度变换_第21张图片

方法二:

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('处理后图像');

MATLAB图形图像处理——图像灰度变换_第22张图片

你可能感兴趣的:(实验,matlab,图形图像处理,matlab,计算机视觉)