• 数字图像处理实验记录一(图像基本灰度变换)


    一、基础知识

    第一次接触这方面的知识,一开始有点措手不及,过了很久才慢慢了解

    图像是什么样的?

    matlab中使用imread()函数读取一副彩色图像后我们得到了以下的矩阵
    在这里插入图片描述
    计算机中,图像就是以这种形式保存的。

    1,空间分辨率,灰度分辨率

    空间分辨率:图像中可分辨的最小细节,由采样间隔值决定,看起来对清晰度有影响
    在这里插入图片描述

    灰度分辨率:灰度级别中可辨别的最小变化,感觉是黑白色之间过渡的级别
    灰度分辨率越小,越黑白

    在这里插入图片描述

    2,灰度图和彩色图的区别

    彩色图:每个像素由R,G,B三个分量表示,用三个二维矩阵分别表示各个像素的R,G,B三个颜色分量。
    灰度图:每个像素只有一个采样颜色,所以用一个二维矩阵来表示各个像素的采样颜色。

    3,什么是灰度直方图?

    在这里插入图片描述
    由此可见,进行灰度变换就是改变灰度值

    二、实验要求

    1,按照灰度变换曲线对图像进行灰度变换

    在这里插入图片描述

    2,读入一幅图像,分别对其进行求反变换、对数变换和幂次变换。并显示原图像和变换后图像。

    三、实验记录

    任务一:

    在这里插入图片描述

    了解了以上的知识后,这个图也能够看懂了
    原图的灰度曲线应该是这个样子的:
    在这里插入图片描述
    是一条过原点斜率为1的曲线

    通过以下操作可以将其变成要求的曲线

    %分段
    x0=0;y0=0;
    x1=48;y1=23;
    x2=196;y2=216;
    x3=255;y3=255;
    
    %算变换斜率
    a1=(y1-y0)/(x1-x0);
    a2=(y2-y1)/(x2-x1);
    a3=(y3-y2)/(x3-x2);
    I2 = I1;
    [height,width] = size(I1) %得出图片的高,宽
    for row = 1:1:height      %遍历图片矩阵
        for col = 1:1:width
            tmp = I2(row,col);
            if(tmp < x1)
                I2(row,col) = a1*tmp;
            elseif(tmp>=x1&tmp<x2)
                I2(row,col) = a2*(tmp-x1)+y1;
            else
                I2(row,col) = a3*(tmp-x2)+y2;
            end
        end
    end
    plot(x,y);
    hold on
    plot([0 x1],[y1 y1],'r--') %画线
    plot([x1 x1],[0 y1],'r--') %画线
    
    plot([0 x2],[y2 y2],'r--') %画线
    plot([x2 x2],[0 y2],'r--') %画线
    
    hold off
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    接下来我们就可以通过以上步骤对图像进行操作:

    %分段
    x0=0;y0=0;
    x1=48;y1=23;
    x2=196;y2=216;
    x3=255;y3=255;
    
    %算变换斜率
    a1=(y1-y0)/(x1-x0);
    a2=(y2-y1)/(x2-x1);
    a3=(y3-y2)/(x3-x2);
    I2 = I1;
    [height,width] = size(I1) %得出图片的高,宽
    for row = 1:1:height      %遍历图片矩阵
        for col = 1:1:width
            tmp = I2(row,col);
            if(tmp < x1)
                I2(row,col) = a1*tmp;
            elseif(tmp>=x1&tmp<=x2)
                I2(row,col) = a2*(tmp-x1)+y1;
            else
                I2(row,col) = a3*(tmp-x2)+y2;
            end
        end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    展示结果代码:
    在这里插入图片描述

    subplot(221);imshow(I1);title('灰度图');
    subplot(222);imhist(I1);title('灰度直方图');
    
    subplot(223);imshow(I2);title('灰度变换后图');
    subplot(224);imhist(I2);title('灰度直方图');
    
    • 1
    • 2
    • 3
    • 4
    • 5

    任务二:

    反转变换:

    把黑变成白,把白变成黑
    公式:
    在这里插入图片描述
    L是灰度级,一般是256

    H=imread('山.png');
    Hi = 255-H;
    subplot(324);imshow(Hi);title('求反变换');
    
    • 1
    • 2
    • 3

    对数变换:

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

    I=imread('山.png');
    c = 1 %对数因子
    I1 = im2double(I);
    I3 = uint8(c*log(1+I1*255)/log(256)*255);
    subplot(121);imshow(I);title('原图');
    subplot(122);imshow(I3);title('对数变换图');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    幂次变换:

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

    gamma = 2.5; % 幂次参数,可根据需要调整
    Hgam = c*im2double(H).^gamma;
    subplot(326);imshow(Hgam);title('幂次变换');
    
    • 1
    • 2
    • 3

    四、结果展示

    结果1:

    在这里插入图片描述

    结果2:

    反转变换:

    在这里插入图片描述

    对数变换:

    在这里插入图片描述

    幂次变换:

    在这里插入图片描述

    五、反思,总结与收获

    1,在matlab中让几幅图片在一个窗口显示

    subplot(121);imshow(I);title('原图');
    subplot(122);imshow(Hgam);title('幂次变换图');
    
    • 1
    • 2

    subplot(a,b,c);将窗口分割成a行b列后,这个图片在序号为c的位置
    序号排序如下:
    在这里插入图片描述
    注意:subplot()函数里面的参数要加,分隔,我没有分隔,是坏习惯

    2,title(’ ') 标题

    在’'之间添加文本就可以显示标题了

    3,uint8

    图像矩阵的数据类型一般是uint8,无符号8位整型数据

    4,im2double()函数

    将图的uint8矩阵转成double矩阵,要注意的是,这个函数一般会将原来uint8数据从0~255范围映射到0~1范围,所以当你想把它重新转成uint8的时候要乘255

    5,matlab判断语句怎么写

    if(条件)
     ...
    elseif(条件)
    ...
    else
    ...
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6,matlab 循环语句怎么写

    for i = 1:7		%这个代表了从17,每次递增1
    ...
    end
    
    for i = 0:2:8   %这个代表了从08,每次递增2
    ...
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    7,清空命令行

    % 在脚本里加入以下语句,在每次运行时会清空命令行
    clear all;
    clc;
    
    • 1
    • 2
    • 3
  • 相关阅读:
    论文阅读——ELECTRA
    CSS清除浮动
    力扣记录:剑指offer(5)——JZ43-52
    二元分类模型评估方法
    JavaScript 30. JSON
    Geogebra 教程之 04 Geogebra 小程序
    什么程度才算精通 Linux?
    含稀土铕双功能荧光磁性纳米粒子/包裹磁性稀土荧光复合物纳米微球的性能与表征
    如何获取视图 view 的字段名和字段类型
    后台管理---表单组件实现双向绑定的方案
  • 原文地址:https://blog.csdn.net/qq_62791684/article/details/133704719