五、数字图像处理Matlab实验 第三章 灰度变换与空间变换(上)

发布于:2024-08-15 ⋅ 阅读:(54) ⋅ 点赞:(0)

在这里插入图片描述

实验所用教材配图资源:数字图像处理-冈萨雷斯-第三版(教材配图)
实验Matlab代码资源:数字图像处理 第三章 灰度变换与空间变换(Matlab实验代码)

一、灰度变换:图像反转 P65

1.1 实验内容

对原图像各像素进行灰度集内的反转变换

1.2 目录结构

在这里插入图片描述

1.3 Matlab代码

% 对原图像取反变换的实验 P65
close all;clear all;clc
% 读入图片
r = imread('Fig0304(breast).tif');
% 在灰度集中取反
L = 256;
s = L - 1 - r;
% 显示图片
figure;
subplot(1,2,1);
imshow(mat2gray(r));
title('原始数字乳房X射线照片');
subplot(1,2,2);
imshow(mat2gray(s));
title('反转后的原始数字乳房X射线照片')

1.4 实验结果

在这里插入图片描述

对数字乳房X射线图片的反转变换

二、灰度变换:对数变换 P66

2.1 实验内容

对原图像各像素进行灰度集内的对数变换

2.2 目录结构

在这里插入图片描述

2.3 Matlab代码

% 对原图像对数变换的实验 P66
close all;clear all;clc
%{
    变换函数
 s = c * log(r+1)
为保证变换前后后的图像的灰度级不变,使
c = (L - 1) / log(L)
%}
 
% 1、读入原图片,imread()函数的返回值类型在数学上为矩阵
r = imread('Fig0305(Fourier).tif');
% 2、对数变换
% ① 设置原图的灰度级
L = 256;
% ② 设置对数变换函数中的常数c
c = (L - 1)  / log(L);
% c = 1;
% mat2gray(),用于将矩阵转换为灰度图
s = mat2gray(c * log(double(r) + 1));
 
figure;
subplot(1,2,1);
imshow(r);
title('傅里叶频谱');
subplot(1,2,2);
imshow(s);
title('对数变换后的傅里叶频谱');

2.4 实验结果

在这里插入图片描述

对傅里叶频谱的对数变换

三、幂律变换 P67 - P68

3.1 实验内容

对原图像各像素进行灰度集内的幂律变换

3.2 目录结构

在这里插入图片描述

3.3 Matlab代码

% 对原图像幂律变换的实验 P67 - P68
close all;clear all;clc
 
% 亮度斜坡实验
% 导入亮度斜坡图片
r = imread('Fig0307(fadelight).tif');
% 伽马校正
s = mat2gray(double(r).^0.4);
s
 
% 显示图像
figure('name','亮度斜坡');
subplot(2,1,1);
imshow(r);
title('原图像')
subplot(2,1,2);
imshow(s);
title('伽马校正后的图像');
 
% 人体脊椎骨折的核磁共振图像(MRI)
r = imread('Fig0308(MRI).tif');
% 伽马校正
s_0_6 = mat2gray(double(r).^0.6);
s_0_4 = mat2gray(double(r).^0.4);
s_0_3 = mat2gray(double(r).^0.3);
% 显示图像
figure('name','人体脊椎骨折的核磁共振图像(MRI)');
subplot(1,4,1);
imshow(r);
title('人体脊椎骨折的核磁共振图像(MRI)')
 
subplot(1,4,2);
imshow(s_0_6);
title('伽马取0.6,校正后的图像');
 
subplot(1,4,3);
imshow(s_0_4);
title('伽马取0.4,校正后的图像');
 
subplot(1,4,4);
imshow(s_0_3);
title('伽马取0.3,校正后的图像');
 
% 航拍图
r = imread('Fig0309(aerial_image).tif');
% 伽马校正
s_3 = mat2gray(double(r).^3);
s_4 = mat2gray(double(r).^4);
s_5 = mat2gray(double(r).^5);
% 显示图像
figure('name','航拍图');
subplot(1,4,1);
imshow(r);
title('航拍图')
 
subplot(1,4,2);
imshow(s_3);
title('伽马取3,校正后的图像');
 
subplot(1,4,3);
imshow(s_4);
title('伽马取4,校正后的图像');
 
subplot(1,4,4);
imshow(s_5);
title('伽马取5,校正后的图像');

3.4 实验结果

在这里插入图片描述

亮度斜坡图像的伽马校正

在这里插入图片描述

人体脊椎骨折的核磁共振图像(MRI)的幂律变换

在这里插入图片描述

航拍图的幂律变换

四、灰度变换:分段线性变换—对比度拉伸 P69

4.1 实验内容

对原图像各像素进行灰度集内的对比度拉伸

4.2 目录结构

在这里插入图片描述

4.3 Matlab代码

  • 编写业务的代码
% 对原图像对比度拉伸的实验 P69
close all;clear all;clc
% 读入图片
r = imread('Fig0310(demo).tif');
% 进行对比度拉伸
L = 256;
L = L - 1;
[row,column] = size(r);    % 读取行r、列c
s_contrast = double(zeros(row,column));
for i = 1:row        % 建立for循环嵌套
    for k = 1:column
        s_cell = double(r(i,k));     
        s_contrast(i,k) = contrast_stretch_function(s_cell);
%         if s_cell < (3.0 * L / 8)
%             s_contrast(i,k) = 1.0 * s_cell / 3;
%         elseif (s_cell > (3.0 * L / 8)) && (s_cell < (5.0 * L / 8))
%             s_contrast(i,k) = 3.0 * s_cell - L;
%         else
%             s_contrast(i,k) = 1.0 * (L - 8) * s_cell / (8 * L - 13) + (7 * L - 5) * (L - 1) / (8 * L - 13);
%         end
        
    end
end
% s_contrast = mat2gray(s_contrast);
 
% 进行阈值处理
s_switch = zeros(row,column);
for i = 1:row        % 建立for循环嵌套
    for k = 1:column
        s_cell = r(i,k);     
        if s_cell < ((L + 1) * 3.4 / 8)
            s_switch(i,k) = 0;
        else
            s_switch(i,k) = L;
        end
    end
end
s_switch = mat2gray(s_switch);
 
 
% 显示图片
figure('name','对比度拉伸')
subplot(1,4,1);
x = 0:0.001:(L-1);
plot(x,contrast_stretch_function(x));
title('变换函数');
 
 
subplot(1,4,2);
imshow(r);
title('(a)低对比度图像');
 
subplot(1,4,3);
imshow(mat2gray(s_contrast));
title('(b)对比度拉伸的结果');
 
subplot(1,4,4);
imshow(s_switch);
title('(c)阈值处理');
  • 包含的函数代码
function y = contrast_stretch_function(x)
%对比度拉伸的分段函数
%   此处显示详细说明
L = 256;
[~,column] = size(x);
y = double([]);
for c = 1:column
    s_cell = x(c);
    if s_cell >= 0 && (s_cell <= (3.0 * L / 8))
        temp = s_cell / 3.0;
    elseif (s_cell > (3.0 * L / 8)) && (s_cell <= (5.0 * L / 8))
        temp = 3.0 * s_cell - L;
    else
        temp = 1.0 * (L - 8) * s_cell / (8 * L - 13) + (7 * L - 5) * (L - 1) / (8 * L - 13);
    end
    if column == 1
        y = temp;
    else
        y(end+1) = temp;
    end
end
end

4.4 实验结果

在这里插入图片描述

对原图像进行对比度拉伸和阈值处理

五、灰度变换:灰度分层 P70

5.1 实验内容

对原图像各像素进行灰度集内的灰度分层

5.2 目录结构

在这里插入图片描述

5.3 Matlab代码

  • 业务逻辑的
% 对原图灰度分层的实验 P70
close all;clear all;clc;
% 读入图片
r = imread('Fig0312(heart).tif');
% 处理图片
% ① 突出某一范围,降低其他范围的灰度
L = 255;
[row,column] = size(r);
s_1 = double(zeros(row,column));
for i = 1:row
    for j = 1:column
        s_cell = r(i,j);
        s_1(i,j) = gray_reduce_layering_function(s_cell);
    end
end
 
% ② 突出某一范围,保持其他范围的灰度不变
s_2 = zeros(row,column);
for i = 1:row
    for j = 1:column
        s_cell = r(i,j);
        s_2(i,j) = gray_layering_function(s_cell);
    end
end
 
% 显示图像
figure('name','大动脉血管造影图片')
subplot(2,3,2);
x = 0:1:(L-1);
plot(x,gray_reduce_layering_function(x));
 
subplot(2,3,3);
plot(x,gray_layering_function(x));
 
subplot(2,3,4);
imshow(r);
title('(a)大动脉血管造影照片');
 
subplot(2,3,5);
imshow(mat2gray(s_1));
title('(b)使用突出指定区间灰度,降低其他灰度值区域的方法');
 
subplot(2,3,6);
imshow(mat2gray(s_2));
title('(c)使用突出指定区间灰度,其他灰度值区域不变的方法');
  • 包含的函数
% 函数①
function y = gray_reduce_layering_function(x)
%灰度分层:突出某区域,其他区域均降低值
%   此处显示详细说明
L = 255;
[~,column] = size(x);
y = double([]);
for i = 1:column
    s_cell = x(i);
    if s_cell > (2.9 * L / 5) && s_cell < (9.8 * L / 10)
        temp = 3.0 * L / 5;
    else
        temp = 1.0 * L / 10;
    end
    if column == 1
        y = temp;
    else
        y(end+1) = temp;
    end
end
end
% 函数②
function y = gray_layering_function(x)
%GRAY_LAYERING_FUNCTION 灰度分层:突出某区域,其他区域不变
%   此处显示详细说明
L = 255;
[~,column] = size(x);
y = double([]);
 
for c = 1:column
    s_cell = x(c);
    if s_cell > (3 * L / 10) && s_cell < (3.0 * L / 5)
        temp = 0;
    else
        temp = s_cell;
    end
    if column == 1
        y =temp;
    else
        y(end+1) = temp;
    end
end
end

5.4 实验结果

在这里插入图片描述

大动脉血管造影照片的灰度分层

六、灰度变换:比特分层 P71

6.1 实验内容

对原图像各像素进行灰度集内的比特分层

6.2 目录结构

在这里插入图片描述

6.3 Matlab代码

% 对图像进行比特平面分层 P71
close all;clear all;clc;
% 读入图片
r = imread('Fig0314(dollar).tif');
% 图片比特分层
L = 256;
[row,column] = size(r);
% 细胞数组,可以保存不同的数据结构,也可直接对细胞内元素进行修改
s_layers = {};
for i = 1:8
    s_layers{end+1} = zeros(row,column);
end
 
% 分离比特层
for i = 1:row
    for j = 1:column
        s_cell = r(i,j);
        s_str = dec2bin(s_cell,8);
        
        for n = 8:-1:1
            if s_str(n) == '1'
                s_layers{9 - n}(i,j) = 1;
            end
        end
        
    end
end
 
% 显示图像
figure;
subplot(3,3,1);
imshow(r);
title('一幅大小为 500 * 1192 像素的8比特灰度图像');
 
for i = 1:8
    subplot(3,3,i+1);
    imshow(mat2gray(s_layers{i}),[0 1]);
    title(['比特平面',num2str(i),'的图像']);
end
 
 
% 重建图像
s_rebuild_8 = 128 * s_layers{8};
s_rebuild_7 = 64 * s_layers{8};
s_rebuild_6 = 32 * s_layers{6};
s_rebuild_5 = 16 * s_layers{5};
 
figure('name','重建图像');
subplot(1,3,1);
s = s_rebuild_8 + s_rebuild_7;
imshow(mat2gray(s));
title("使用比特平面87的图像");
 
subplot(1,3,2);
s = s + s_rebuild_6;
imshow(mat2gray(s));
title("使用比特平面8,76的图像");
 
subplot(1,3,3);
s = s + s_rebuild_5;
imshow(mat2gray(s));
title("使用比特平面8,7,65的图像");

6.4 实验结果

在这里插入图片描述

对原图像按比特进行分层

在这里插入图片描述

使用各比特平面进行重建

七、直方图均衡 P77

7.1 实验内容

对图像每个像素进行处理,使最终图像表现为:
① 包含尽可能多的灰度级
② 各灰度级尽可能的均匀分布

7.2 文件目录结构

在这里插入图片描述

7.3 Matlab代码

% 对原图像进行直方图均衡的实验 P77
close all;clear all;clc;
 
% 读入图片
r_2 = imread('Fig0320(1).tif');
r_3 = imread('Fig0320(2).tif');
r_4 = imread('Fig0320(3).tif');
r_1 = imread('Fig0320(4).tif');
 
% 直方图均衡处理
s_1 = histeq(r_1,256); 
s_2 = histeq(r_2,256);
s_3 = histeq(r_3,256);
s_4 = histeq(r_4,256);
 
% 显示图像
figure;
subplot(4,4,1);
imshow(r_1); % 原图像显示
title('原图像');
subplot(4,4,2);
imhist(r_1); % 显示原图像的直方图
title('原图像的直方图');
subplot(4,4,3);
imshow(s_1); % 显示均衡化后的图像
title('均衡化后的图像');
subplot(4,4,4);
imhist(s_1); % 显示均衡化后图像的直方图
title('均衡化后图像的直方图');
 
subplot(4,4,5);
imshow(r_2); % 原图显示
subplot(4,4,6);
imhist(r_2); % 显示原图像的直方图
subplot(4,4,7);
imshow(s_2); % 显示均衡化后的图像
subplot(4,4,8);
imhist(s_2); % 显示均衡化后图像的直方图
 
subplot(4,4,9);
imshow(r_3); % 原图显示
subplot(4,4,10);
imhist(r_3); % 显示原图像的直方图
subplot(4,4,11);
imshow(s_3); % 显示均衡化后的图像
subplot(4,4,12);
imhist(s_3); % 显示均衡化后图像的直方图
 
subplot(4,4,13);
imshow(r_4); % 原图显示
subplot(4,4,14);
imhist(r_4); % 显示原图像的直方图
subplot(4,4,15);
imshow(s_4); % 显示均衡化后的图像
subplot(4,4,16);
imhist(s_4); % 显示均衡化后图像的直方图

7.4 实验结果

在这里插入图片描述

直方图均衡前后的图像及灰度、像素占比数据显示